1. Тема дня
Жизненный цикл identity:
device produced
→ unique device_id
→ key pair
→ CSR
→ client certificate
→ mTLS
→ certificate rotation
→ revocation
→ decommissionГлавная мысль: у каждого устройства должна быть собственная криптографическая идентичность. Производственная станция не должна записывать один общий пароль или private key на весь парк.
2. Зачем это нужно
Схема username=device/password=common опасна:
утечка одного устройства -> компрометация всех.Правильно:
TC-0001842 -> unique private key -> unique client certificate -> mTLSПри компрометации отзывается один сертификат. Идентичность устройства должна связывать:
device_id;
ESP32 MAC;
EC25 IMEI;
hardware revision;
client certificate fingerprint;
firmware release;
HIL result.3. Теория
Серийный номер - не криптографическая identity
device_id, MAC, IMEI, STM32 UID - это инвентаризационные признаки. Private key доказывает владение identity.
Key pair
private key: секрет, не покидает устройство;
public key: в сертификате, сервер проверяет подпись.Для embedded часто удобно ECC P-256.
CSR
Device генерирует key pair, создает CSR и отправляет CA public key + proof. CA выпускает сертификат и не получает private key.
Модели provisioning
Плохо:
один общий key/cert на весь парк.Лучше:
station генерирует unique key и записывает в устройство.Еще лучше:
key pair генерируется на устройстве или secure element;
station получает только CSR.A/B credential slots
Ротация не должна перезаписывать active credentials:
identity_a ACTIVE
identity_b PENDINGНовая identity активируется только после proof-of-possession/TLS probe.
Где хранить private key ESP32
Варианты:
embedded in firmware: только лабораторно;
NVS Encryption + Flash Encryption: лучше;
secure element ATECC608A: сильнее;
новые ESP32 SoC с hardware-backed crypto: зависит от target.Для классического ESP32-WROOM-32U внешний secure element - хороший вариант, если private key не должен быть извлекаемым software.
STM32
На STM32 private key можно хранить во внутренней защищенной Flash/TrustZone/Secure Storage или в STSAFE. STSAFE-A110 умеет on-chip key generation и ECDSA operations без выдачи private key MCU.
4. Типичные ошибки
- Один сертификат на все устройства.
- MAC/IMEI считается доказательством identity.
- Private key генерируется в общем CI job.
- Private key хранится в Git.
- Backend получает private key вместо CSR.
- Active сертификат перезаписывается без A/B.
- Старый cert удаляется до проверки нового.
- Server verification отключается, потому что есть client cert.
- Key хранится в plaintext NVS.
- PEM key попадает в debug log.
- Certificate expiry не мониторится.
- Bootstrap token один на всю партию.
- Нет recovery path при потере credentials.
5. Практическое задание на 30-60 минут
Создай DEVICE_IDENTITY_POLICY.md:
# Device identity policy
1. Every production device has a unique key pair.
2. A private key is never shared by multiple devices.
3. The backend receives CSR, never a device private key.
4. MAC, UID and IMEI are inventory attributes, not credentials.
5. Server certificate verification is always enabled.
6. Operational credentials are stored in A/B slots.
7. New credentials are tested before activation.
8. Old credentials are retained during a grace period.
9. Every credential has a generation and fingerprint.
10. Production private keys are never stored in Git or CI artifacts.
11. Lost credentials do not fall back to a common password.
12. Provisioning produces an auditable device record.Создай development CA и device certificate через OpenSSL:
# Editorial addition: development CA only; not a production provisioning workflow.
cat > device.ext <<'EOF'
basicConstraints=critical,CA:FALSE
keyUsage=critical,digitalSignature
extendedKeyUsage=clientAuth
subjectAltName=URI:urn:traffic-controller:device:TC-DEV-0001
EOF
openssl x509 -req -in TC-DEV-0001.csr -CA dev-ca.crt -CAkey dev-ca.key \
-CAcreateserial -out TC-DEV-0001.crt -days 365 -sha256 -extfile device.ext
openssl verify -purpose sslclient -CAfile dev-ca.crt TC-DEV-0001.crtOpenSSL x509: подпись CSR и расширения сертификата
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out dev-ca.key
openssl req -x509 -new -key dev-ca.key -sha256 -days 3650 \
-subj "/CN=Embedded Development CA" -out dev-ca.crt
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out TC-DEV-0001.key
openssl req -new -key TC-DEV-0001.key -subj "/CN=TC-DEV-0001" -out TC-DEV-0001.csrДобавь SAN:
subjectAltName=URI:urn:traffic-controller:device:TC-DEV-0001
keyUsage=critical,digitalSignature
extendedKeyUsage=clientAuthПроверь:
openssl verify -CAfile dev-ca.crt TC-DEV-0001.crtДобавь CLI identity info, который показывает fingerprint, issuer, SAN, generation, backend, но не private key.
6. Что почитать или попробовать дальше
- ESP-TLS client certificate, NVS Encryption, ATECC608A integration.
- STSAFE-A110 / X-CUBE-STSE01.
- Device provisioning audit records и CSR enrollment.
Критерии: Явно сохраните границу private key.
Задание
Опишите безопасную A/B rotation credentials при identity_a ACTIVE и identity_b PENDING. Укажите момент активации новой identity и то, что нельзя удалять преждевременно.
Критерии самопроверки: Разделите запись, проверку и активацию; сохраняйте разные generations/fingerprints и не раскрывайте private key в диагностике.
Показать ответ автора
Записать новые credentials в неактивный/PENDING slot, проверить proof-of-possession и TLS probe, затем активировать новую identity. Не перезаписывать текущие active credentials и не удалять старый сертификат до проверки новой identity; сохранить предусмотренный grace/recovery path.