Saat menghubungkan perangkat ke IoT Platform menggunakan gateway Message Queuing Telemetry Transport (MQTT), Anda dapat memanfaatkan sertifikat kustom untuk memverifikasi identitas perangkat. Selanjutnya, Anda dapat mendaftarkan perangkat menggunakan nama umum (CN) dari sertifikat. Topik ini menjelaskan cara menghubungkan perangkat ke IoT Platform melalui gateway MQTT, dengan contoh penggunaan Alibaba Cloud Function Compute untuk verifikasi identitas perangkat.
Catatan penggunaan
Dalam topik ini, izin pengguna biasa digunakan untuk semua operasi. Jika diperlukan izin administrator untuk operasi tertentu, jalankan perintah sudo.
Prasyarat
Sebuah instance Exclusive Enterprise Edition telah dibeli. Dalam contoh ini, instance tersebut dibeli di wilayah China (Shanghai). Untuk informasi lebih lanjut, lihat Membeli Instance Enterprise Edition.
Informasi latar belakang
Gateway MQTT dari IoT Platform mendukung verifikasi pihak ketiga melalui Function Compute, sertifikat kustom, OCSP, dan topik kustom untuk memverifikasi serta menghubungkan perangkat ke IoT Platform, sehingga memungkinkan komunikasi yang efisien. Hal ini membantu Anda mengimplementasikan berbagai skenario bisnis IoT.
Untuk detail lebih lanjut tentang verifikasi dan komunikasi antara gateway MQTT dan perangkat, lihat Gateway MQTT.
Buat persiapan
Contoh ini menggunakan Ubuntu 22.04 sebagai lingkungan pengembangan.
Langkah 1: Hasilkan sertifikat kustom
Masuk ke Ubuntu.
Jalankan perintah berikut untuk menghasilkan file sertifikat root bernama
root-ca.crtuntuk perangkat dan server:openssl req \ -new \ -newkey rsa:2048 \ -days 365 \ -nodes \ -x509 \ -subj "/C=CN/O=Aliyun IOT/CN=IoT CA" \ -keyout root-ca.key \ -out root-ca.crtBuat sertifikat sisi server kustom berdasarkan file sertifikat root
root-ca.crt.Jalankan perintah berikut untuk menghasilkan file kunci sisi server bernama
server.key:openssl genrsa -out server.key 2048Jalankan perintah
touch openssl.cnfuntuk membuat file bernamaopenssl.cnf.Jalankan perintah
vi openssl.cnfuntuk membuka file openssl.cnf, salin kode berikut ke dalam file, tekan tombol Esc, masukkan:wq, lalu tekan tombol Enter untuk menyimpan file.[policy_match] countryName = cn stateOrProvinceName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional [req] default_bits = 2048 distinguished_name = req_distinguished_name req_extensions = req_ext x509_extensions = v3_req prompt = no [req_distinguished_name] commonName = Server [req_ext] subjectAltName = @alt_names [v3_req] subjectAltName = @alt_names [alt_names] DNS.1 = *.mqtt.iothub.aliyuncs.com DNS.2 = *.igw.iothub.aliyuncs.comJalankan perintah berikut untuk menghasilkan file permintaan sisi server bernama
server.csr:openssl req -new -key server.key -config openssl.cnf -out server.csrJalankan perintah berikut untuk menghasilkan file sertifikat sisi server bernama
server.crt:openssl x509 -req -days 365 -sha256 -in server.csr -CA root-ca.crt -CAkey root-ca.key -CAcreateserial -out server.crt -extensions v3_req -extfile openssl.cnfJalankan perintah berikut untuk memverifikasi sertifikat sisi server:
openssl verify -CAfile root-ca.crt server.crt
Buat sertifikat sisi perangkat berdasarkan file sertifikat root
root-ca.crt.Jalankan perintah berikut untuk menghasilkan file kunci sisi perangkat bernama
client.key:openssl genrsa -out client.key 2048Jalankan perintah berikut untuk menghasilkan file permintaan sisi perangkat bernama
client.csrdan atur parameter CN menjadiClient_123:openssl req -new -key client.key -out client.csr -subj "/CN=Client_123"Jalankan perintah berikut untuk menghasilkan file sertifikat sisi perangkat bernama
client.crt:openssl x509 -req -days 365 -sha256 -in client.csr -CA root-ca.crt -CAkey root-ca.key -CAcreateserial -out client.crtJalankan perintah berikut untuk memverifikasi sertifikat sisi perangkat:
openssl verify -CAfile root-ca.crt client.crt
Gambar berikut menunjukkan file sertifikat kustom yang dihasilkan.

Langkah 2: Buat fungsi Function Compute untuk memverifikasi perangkat
Di bilah navigasi atas, pilih wilayah. Pada halaman Services, klik Create Service.
Di panel Create Service, masukkan service name. Contoh: IoT_Service. Lalu, klik OK.
Pada halaman Functions, klik Create Function.
Pada halaman Create Function, konfigurasikan parameter dan klik Create, seperti yang ditunjukkan pada gambar berikut.

Pada halaman Function Details, ganti kode sampel yang ada dengan kode berikut dan klik Deploy.
Fungsi verifikasi mengembalikan CN dari sertifikat sisi perangkat sebagai nilai parameter deviceName.
# -*- coding: utf-8 -*- import logging import json import time import enum import random import string class Request: def __init__(self, json_str): self.clientId = None self.username = None self.password = None self.certificateCommonName = None for key, value in json.loads(json_str).items(): setattr(self, key, value) class Response: def __init__(self): self.deviceName = None self.result = 'true' self.message = 'success' def handler(self, request): # Mengembalikan CN dari sertifikat sisi perangkat sebagai nilai parameter deviceName. self.deviceName = request.certificateCommonName return json.dumps(self.__dict__) def handler(event, context): request = Request(event) return Response().handler(request)
Langkah 3: Buat gateway
Pada halaman Overview, klik kartu instance Exclusive Enterprise Edition.
Di panel navigasi sebelah kiri, pilih Devices > Gateway. Pada halaman Gateway, klik Add Gateway.
Di kotak dialog Tambah Gateway, konfigurasikan parameter berikut dan klik OK.
Atur parameter Server Certificate ke konten file
server.crt, parameter Private Key of Server Certificate ke konten fileserver.key, dan parameter Device Root Certificate ke konten fileroot-ca.crt. Untuk informasi lebih lanjut tentang parameter, lihat Buat Gateway.
Pada halaman Gateway, salin URL di kolom Gateway URL dari gateway.

Langkah 4: Kembangkan program sisi perangkat
Pergi ke Ubuntu.
Jalankan perintah berikut untuk menginstal dependensi:
sudo apt-get install build-essential gcc make cmake cmake-gui cmake-curses-gui sudo apt-get install libssl-devJalankan perintah berikut untuk menginstal library Paho MQTT open source:
git clone https://github.com/eclipse/paho.mqtt.c.git mkdir build && cd build cmake ../paho.mqtt.c -DPAHO_WITH_SSL=TRUE -DCMAKE_INSTALL_PREFIX="/usr/lib" make -j sudo make install && cd ..Jalankan perintah
touch aiot_mqtt_demo.cuntuk membuat file simulator perangkat bernamaaiot_mqtt_demo.c.Jalankan perintah
vi aiot_mqtt_demo.cuntuk membuka file. Salin kode berikut ke dalam file:#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include "MQTTClient.h" int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message) { printf("message recv < topic [%s], payload [%s]\n", topicName, (char *)message->payload); MQTTClient_freeMessage(&message); MQTTClient_free(topicName); return 1; } int main(int argc, char* argv[]) { MQTTClient client; MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer; MQTTClient_SSLOptions ssl_opts = MQTTClient_SSLOptions_initializer; int rc; /* Buat klien MQTT. Ganti informasi dengan informasi aktual. */ const char *host = "ssl://iot-0****.igw.iothub.aliyuncs.com:1883"; const char *client_id = "12345"; MQTTClient_create(&client, host, client_id, MQTTCLIENT_PERSISTENCE_NONE, NULL); MQTTClient_setCallbacks(client, NULL, NULL, msgarrvd, NULL); /* Konfigurasikan parameter koneksi, seperti sertifikat, nama pengguna, dan kata sandi. Ganti informasi dengan informasi aktual. */ ssl_opts.trustStore = "root-ca.crt"; ssl_opts.privateKey = "client.key"; ssl_opts.keyStore = "client.crt"; conn_opts.ssl = &ssl_opts; conn_opts.username = "sdk_test01"; conn_opts.password = "hello123"; /* Koneksi MQTT terbentuk. */ if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) { printf("Gagal terhubung, kode balik %d\n", rc); exit(EXIT_FAILURE); } printf("koneksi berhasil username %s, password %s\n", conn_opts.username, conn_opts.password); /* Berlangganan pesan. */ MQTTClient_subscribe(client, "/user/aiot_mqtt_demo_downraw", 1); /* Hasilkan pesan dan kirim pesan secara berkala. */ MQTTClient_message pubmsg = MQTTClient_message_initializer; const char *topic = "/user/aiot_mqtt_demo_upraw"; pubmsg.payload = "Hello Service!"; pubmsg.payloadlen = (int)strlen(pubmsg.payload); pubmsg.qos = 1; for(int i = 0; i < 100; i++) { MQTTClient_publishMessage(client, topic, &pubmsg, NULL); printf("pesan terkirim > topik [%s], payload [%s]\n", topic, (char *)pubmsg.payload); sleep(10); } /* Tutup koneksi dan hapus klien MQTT. */ MQTTClient_disconnect(client, 10000); MQTTClient_destroy(&client); return rc; }Ganti informasi dalam kode sebelumnya dengan informasi aktual, tekan tombol Esc, masukkan
:wq, lalu tekan tombol Enter untuk menyimpan fileaiot_mqtt_demo.c.Parameter
Deskripsi
host
Titik akhir gateway MQTT yang ingin Anda hubungkan perangkatnya. Format:
ssl://${Endpoint Gateway}:${Nomor Port}.Gunakan titik akhir dan port yang diperoleh dari Langkah 3.client_id
Opsional. ID klien. ID klien harus memiliki panjang 1 hingga 64 karakter. Kami merekomendasikan Anda menggunakan alamat MAC atau nomor seri (SN) perangkat sebagai ID klien.
ssl_opts.trustStore
Lokasi penyimpanan file sertifikat root sisi perangkat
root-ca.crt.ssl_opts.privateKey
Lokasi penyimpanan file sisi perangkat
client.key.ssl_opts.keyStore
Lokasi penyimpanan file sertifikat sisi perangkat
client.crt.conn_opts.username
Nama pengguna yang digunakan untuk membangun koneksi MQTT.
Nama pengguna harus memiliki panjang 4 hingga 32 karakter, dan dapat berisi huruf, angka, tanda hubung (-), garis bawah (_), at (@), titik (.), dan titik dua (:). Nama pengguna harus unik dalam produk.
conn_opts.password
Kata sandi yang digunakan untuk membangun koneksi MQTT.
Kata sandi harus memiliki panjang 1 hingga 32 karakter, dan dapat berisi huruf, angka, tanda hubung (-), garis bawah (_), at (@), titik (.), dan titik dua (:).
Gambar berikut menunjukkan library, file sertifikat, dan file kode yang dihasilkan dan digunakan dalam contoh ini.
Langkah 5: Kompilasi dan jalankan program
Jalankan perintah berikut untuk menjalankan file kode
aiot_mqtt_demo.c:gcc -o aiot_mqtt_demo aiot_mqtt_demo.c -lpaho-mqtt3cs ./aiot_mqtt_demoSetelah menjalankan file kode, nilai Client_123 dari parameter deviceName yang dikembalikan oleh fungsi Function Compute digunakan sebagai DeviceName dari perangkat IoT Platform. Pergi ke halaman Detail Instance dari instance yang ingin Anda kelola di Konsol IoT Platform. Di panel navigasi sebelah kiri, pilih Devices > Devices, perangkat bernama
Client_123secara otomatis dibuat dan perangkat tersebut dalam keadaan Online, seperti yang ditunjukkan pada gambar berikut.
Opsional. Pergi ke halaman Detail Instance dari instance yang ingin Anda kelola di Konsol IoT Platform. Di panel navigasi sebelah kiri, pilih Maintenance > Device Log. Pada halaman Log Perangkat, lihat data yang dikirimkan oleh perangkat.
