Autentikasi Perangkat Aman dengan Sertifikat X.509 di Eclipse Hono
Dalam beberapa bulan terakhir, liputan media telah menyoroti perangkat IoT yang tidak aman yang gagal memenuhi standar keamanan dasar. Kekhawatiran yang berulang adalah kerahasiaan data yang ditransmisikan dari perangkat ke layanan cloud. Menakjubkan, banyak perangkat mengirim data melalui jaringan publik tanpa enkripsi, meskipun protokol berbasis TCP/IP seperti HTTP dan MQTT mendukung enkripsi TLS.
Eclipse Hono telah mengaktifkan TLS untuk adapter HTTP dan MQTT-nya sejak awal. Milestone 0.9-M2 kini menambahkan dukungan untuk autentikasi sertifikat klien X.509 selama handshake TLS, memungkinkan perangkat untuk menggunakan pasangan kunci alih-alih nama pengguna/kata sandi.
Calling all developers
Hackathon IoT terbesar di Eropa kembali ke Berlin pada 14-15 Mei 2023. Bergabunglah dengan 700+ pengembang dalam tantangan spesifik domain, belajar, berjaringan, dan bersenang-senang.
Dalam panduan ini kami membahas contoh lengkap: membuat dan mendaftarkan trust anchor spesifik tenant, menghasilkan sertifikat perangkat, mendaftarkan subject DN-nya, dan menggunakan sertifikat untuk mengautentikasi perangkat terhadap adapter MQTT Hono. Pengetahuan kerja tentang kriptografi RSA dan konsep X.509 (RFC 5280) diasumsikan.
Mengapa sertifikat klien?
Menggunakan kata sandi memerlukan menyimpan rahasia per perangkat di layanan Credentials Hono, yang kemudian dibandingkan dengan kata sandi yang disediakan perangkat. Sertifikat klien menghilangkan kebutuhan akan rahasia per perangkat. Dengan mendaftarkan satu trust anchor untuk tenant, semua sertifikat perangkat dapat divalidasi dalam handshake TLS menggunakan kunci publik tenant.
Buat otoritas sertifikat tenant
Hasilkan pasangan kunci RSA dan sertifikat self-signed tenant. Ini akan menandatangani semua sertifikat perangkat.
$ 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"
Gunakan hanya atribut X.500 standar (CN, L, ST, O, OU, C, STREET, DC, UID) untuk menjaga DN tetap sederhana.
Daftarkan tenant
Daftarkan trust anchor dengan Hono. Contoh berikut menggunakan Hono Sandbox (v0.9-M2 atau lebih baru). Ganti ACME dengan ID tenant unik untuk instance Anda.
$ 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
Buat sertifikat perangkat
Hasilkan pasangan kunci perangkat dan sertifikat yang ditandatangani oleh CA tenant.
$ 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
Daftarkan perangkat
Daftarkan ID perangkat dengan tenant.
$ curl -i -H "Content-Type: application/json" --data-binary '{"device-id":"hot-fuzz"}' https://hono.eclipse.org:28443/registration/$TENANT
Daftarkan subject DN perangkat
Asosiasikan subject DN sertifikat perangkat dengan ID perangkat.
$ 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
Uji koneksi
Mulai consumer untuk tenant dan publikasikan telemetri menggunakan sertifikat perangkat.
# 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"
Jika berhasil, konsol consumer akan menampilkan pesan. Anda juga dapat mempublikasikan melalui 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