Безопасная аутентификация устройств с X.509 сертификатами в Eclipse Hono
В последние месяцы медиа-охват подсвечивал небезопасные IoT-устройства, не соответствующие базовым стандартам безопасности. Повторяющаяся забота — конфиденциальность данных, передаваемых от устройств к облачным сервисам. Удивительно, но многие устройства шлют данные через публичные сети нешифрованными, даже если TCP/IP-базированные протоколы вроде HTTP и MQTT поддерживают TLS-шифрование.
Eclipse Hono включил TLS для своих HTTP и MQTT адаптеров с самого начала. 0.9-M2 milestone теперь добавляет поддержку X.509 клиент-сертификатной аутентификации во время TLS-хендшейка, позволяя устройствам использовать пару ключей вместо логина/пароля.
Призыв к разработчикам
Крупнейший в Европе IoT-хакатон возвращается в Берлин 14-15 мая 2023. Присоединяйтесь к 700+ разработчикам в доменно-специфичных вызовах, учитесь, нетворкайте и веселитесь.
В этом гайде мы пройдемся через полный пример: создайте и зарегистрируйте tenant-специфичный trust anchor, сгенерируйте устройственный сертификат, зарегистрируйте его subject DN и используйте сертификат для аутентификации устройства против MQTT-адаптера Hono. Предполагается рабочее знание RSA-криптографии и X.509 концепций (RFC 5280).
Зачем клиентские сертификаты?
Использование паролей требует хранения секрета на устройство в Credentials сервисе Hono, который затем сравнивается с предоставленным устройством паролем. Клиентские сертификаты устраняют потребность в пер-device секретах. Регистрируя единственный trust anchor для тенанта, все устройственные сертификаты могут быть валидированы в TLS-хендшейке с использованием публичного ключа тенанта.
Создание tenant certificate authority
Сгенерируйте RSA ключевую пару тенанта и самоподписанный сертификат. Они будут подписывать все устройственные сертификаты.
$ openssl genrsa -out tenant-key.pem 4096
$ openssl req -x509 -key tenant-key.pem -out tenant-cert.pem -days 365 -subj "/O=ACME Inc./CN=Sensors"
Используйте только стандартные X.500 атрибуты (CN, L, ST, O, OU, C, STREET, DC, UID) чтобы держать DN простым.
Регистрация тенанта
Зарегистрируйте trust anchor с Hono. Следующий пример использует Hono Sandbox (v0.9-M2 или позже). Замените ACME на уникальный tenant ID для вашего инстанса.
$ TENANT="ACME"
$ SUBJECT=$(openssl x509 -in tenant-cert.pem -noout -subject -nameopt RFC2253 | sed s/^subject=//)
$ PK=$(openssl x509 -in tenant-cert.pem -noout -pubkey | sed /^---/d | sed -z 's/\n//g')
$ cat < tenant.json
{
"tenant-id": "$TENANT",
"trusted-ca": {
"subject-dn": "$SUBJECT",
"public-key": "$PK"
}
}
EOS
$ curl -i -H "Content-Type: application/json" -H "Expect:" --data-binary @tenant.json https://hono.eclipse.org:28443/tenant
Создание устройственного сертификата
Сгенерируйте устройственную ключевую пару и сертификат, подписанный CA тенанта.
$ openssl genrsa -out device-key.pem 4096
$ openssl req -new -key device-key.pem -subj "\/O=ACME Inc.\/CN=Hot Fuzz Device" | \
openssl x509 -req -days 365 -out device-cert.pem -CA tenant-cert.pem -CAkey tenant-key.pem -CAcreateserial
Регистрация устройства
Зарегистрируйте device ID с тенантом.
$ curl -i -H "Content-Type: application/json" --data-binary '{"device-id":"hot-fuzz"}' https://hono.eclipse.org:28443/registration/$TENANT
Регистрация subject DN устройства
Ассоциируйте subject DN устройственного сертификата с device ID.
$ SUBJECT=$(openssl x509 -in device-cert.pem -noout -subject -nameopt RFC2253 | sed s/^subject=//)
$ cat < credentials.json
{
"device-id": "hot-fuzz",
"type": "x509-cert",
"auth-id": "$SUBJECT",
"secrets": [{}]
}
EOS
$ curl -i -H "Content-Type: application/json" --data-binary @credentials.json https://hono.eclipse.org:28443/credentials/$TENANT
Тест соединения
Запустите консьюмера для тенанта и опубликуйте телеметрию, используя устройственный сертификат.
# Start consumer
java -jar hono-cli-*-exec.jar \
--hono.client.host=hono.eclipse.org \
--hono.client.port=15671 \
--hono.client.tlsEnabled=true \
--hono.client.username=consumer@HONO \
--hono.client.password=verysecret \
--spring.profiles.active=receiver \
--tenant.id=$TENANT
# Publish telemetry via MQTT
mosquitto_pub -h hono.eclipse.org -p 8883 \
--capath /etc/ssl/certs/ \
--cert device-cert.pem \
--key device-key.pem \
-q 1 -t telemetry -m "Hello there"
Если успешно, консоль консьюмера покажет сообщение. Можно также публиковать через HTTP:
curl -i --cert device-cert.pem --key device-key.pem \
-H "Content-Type: plain/text" -H "Expect:" \
--data-binary "Hello there" https://hono.eclipse.org:8443/telemetry
Интернет вещей
- Теория твердотельных приборов: от физики к практическим приложениям
- Eclipse Hono запускает MongoDB-based Device Registry — масштабируемый, production-ready
- Eclipse Hono 1.0.0 запускается: унифицированная open-source IoT connectivity платформа
- Надёжные решения power-on для батарейных медицинских устройств
- Отслеживание достижений в технологии медицинских устройств
- Система управления температурой на базе LM35 с микроконтроллером AT89S52
- Arm усиливает IoT-коннективность и управление устройствами через покупку Stream Technologies
- Уязвимости IoT-устройств exponenруют умный дом атакам: угроза компрометации учетных данных
- Неконфигурированные IoT-устройства: скрытая угроза вашему умному дому
- Хакинг встроенного железа для IoT-устройств: инструменты, техники и бизнес-импликации