Saat menghubungkan perangkat ke Platform IoT melalui gerbang MQTT, Anda dapat menggunakan sertifikat kustom untuk memverifikasi identitasnya dan mendaftarkannya berdasarkan Common Name (CN) dari sertifikat tersebut. Topik ini menjelaskan cara menghubungkan perangkat ke Platform IoT menggunakan verifikasi pihak ketiga dengan Alibaba Cloud Function Compute (FC).
Catatan penting
Langkah-langkah dalam topik ini dilakukan sebagai pengguna biasa. Jika suatu operasi memerlukan izin administratif, tambahkan awalan perintah dengan sudo.
Prasyarat
Anda telah membeli instans Edisi Perusahaan Eksklusif. Topik ini menggunakan contoh instans di wilayah China (Shanghai). Untuk informasi selengkapnya, lihat Beli instans Edisi Perusahaan.
Informasi latar belakang
Platform IoT menyediakan fitur gerbang MQTT yang memungkinkan perangkat terhubung dan berkomunikasi. Anda dapat memanfaatkan fitur seperti verifikasi pihak ketiga dengan Function Compute, sertifikat kustom, Online Certificate Status Protocol (OCSP), serta topik komunikasi kustom untuk otentikasi guna mendukung berbagai skenario bisnis.
Untuk informasi selengkapnya tentang otentikasi dan komunikasi perangkat melalui gerbang MQTT, lihat Ikhtisar gerbang MQTT.
Persiapan
Topik ini menggunakan Ubuntu 22.04 sebagai lingkungan pengembangan.
Langkah 1: Hasilkan sertifikat kustom
-
Login ke sistem operasi Ubuntu.
-
Jalankan perintah berikut untuk menghasilkan sertifikat root
root-ca.crtuntuk sisi perangkat dan sisi 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.crt -
Hasilkan sertifikat kustom sisi server berdasarkan sertifikat root
root-ca.crt.-
Jalankan perintah berikut untuk menghasilkan file kunci sisi server
server.key:openssl genrsa -out server.key 2048 -
Jalankan perintah
touch openssl.cnfuntuk membuat file bernamaopenssl.cnf. -
Jalankan perintah
vi openssl.cnf. Kemudian, tambahkan konten berikut ke file tersebut, tekan tombol Esc, lalu masukkan:wquntuk menyimpan dan keluar.[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.com -
Jalankan perintah berikut untuk menghasilkan file permintaan sisi server
server.csr:openssl req -new -key server.key -config openssl.cnf -out server.csr -
Jalankan perintah berikut untuk menghasilkan file sertifikat sisi server
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.cnf -
Jalankan perintah berikut untuk memverifikasi sertifikat sisi server:
openssl verify -CAfile root-ca.crt server.crt
-
-
Hasilkan sertifikat kustom sisi perangkat berdasarkan sertifikat root
root-ca.crt.-
Jalankan perintah berikut untuk menghasilkan file kunci sisi perangkat
client.key:openssl genrsa -out client.key 2048 -
Jalankan perintah berikut untuk menghasilkan file permintaan sertifikat sisi perangkat
client.csr. Atur 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
client.crt:openssl x509 -req -days 365 -sha256 -in client.csr -CA root-ca.crt -CAkey root-ca.key -CAcreateserial -out client.crt -
Jalankan perintah berikut untuk memverifikasi sertifikat sisi perangkat:
openssl verify -CAfile root-ca.crt client.crt
-
Langkah 2: Buat fungsi FC untuk otentikasi
-
Di bilah navigasi atas, pilih wilayah China (Shanghai). Pada halaman Services, klik Create Service.
-
Di panel Create Service, masukkan Service Name, misalnya IoT_Service, lalu klik OK.
-
Pada halaman Functions, klik Create Function.
-
Pada halaman Create Function, konfigurasikan parameter berikut lalu klik Create.
Pilih Create with Built-in Runtime sebagai metode pembuatan. Untuk Function Name, masukkan
three_party_auth. Untuk Request Handler Type, pilih Event Handler. Untuk Runtime, pilih Python 3.6. -
Pada halaman Function Details, ganti kode contoh dengan kode berikut lalu klik Deploy Code.
Fungsi otentikasi mengembalikan CN dari sertifikat perangkat sebagai 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): # Kembalikan CN dari sertifikat perangkat sebagai deviceName. self.deviceName = request.certificateCommonName return json.dumps(self.__dict__) def handler(event, context): request = Request(event) return Response().handler(request)
Langkah 3: Buat gerbang
-
Di halaman Instance Overview, klik instans Edisi Perusahaan Eksklusif yang dituju.
-
Di panel navigasi sebelah kiri, pilih Device Management > Gateway, lalu klik Add Gateway.
-
Konfigurasikan parameter berikut lalu klik OK.
Untuk Server Certificate, gunakan konten dari
server.crt. Untuk Server Certificate Private Key, gunakan konten dariserver.key. Untuk Device Root Certificate, gunakan konten dariroot-ca.crt. Untuk informasi selengkapnya tentang parameter tersebut, lihat Tambahkan gerbang.Untuk Protocol, pilih MQTT. Untuk Custom Port, masukkan
1883. Untuk Authentication Type, pilih Third-party Authentication. Untuk Enable Data Passthrough, pilih No. Untuk Enable Device X.509 Certificate Authentication, pilih No. Untuk Enable OCSP, pilih Disabled. Untuk Device Authentication FC Service, pilihIoT_Service. Untuk Device Authentication FC Function, pilihthree_party_auth. Untuk Authorization, pilihAliyunIOTAccessingFCRole. -
Di daftar gerbang, salin dan simpan Gateway URL.
Langkah 4: Kembangkan program sisi perangkat
-
Kembali ke sistem operasi Ubuntu.
-
Jalankan perintah berikut untuk menginstal library yang diperlukan:
sudo apt-get install build-essential gcc make cmake cmake-gui cmake-curses-gui sudo apt-get install libssl-dev -
Jalankan perintah berikut untuk menginstal library open source Paho MQTT:
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 tersebut dan tambahkan konten berikut:#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 nilai placeholder. */ 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: sertifikat, username, dan password. Ganti nilai placeholder. */ 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"; /* Bangun koneksi MQTT. */ if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) { printf("Gagal terhubung, kode balasan %d\n", rc); exit(EXIT_FAILURE); } printf("berhasil terhubung username %s, password %s\n", conn_opts.username, conn_opts.password); /* Berlangganan ke topik. */ MQTTClient_subscribe(client, "/user/aiot_mqtt_demo_downraw", 1); /* Hasilkan dan publikasikan pesan dalam loop. */ 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("message send > topic [%s], payload [%s]\n", topic, (char *)pubmsg.payload); sleep(10); } /* Putuskan koneksi dan hapus klien. */ MQTTClient_disconnect(client, 10000); MQTTClient_destroy(&client); return rc; } -
Dalam kode tersebut, modifikasi parameter sesuai informasi perangkat aktual Anda. Lalu, tekan tombol Esc dan masukkan
:wquntuk menyimpan fileaiot_mqtt_demo.c.Parameter
Deskripsi
host
Titik akhir gerbang MQTT untuk koneksi perangkat. Formatnya adalah
ssl://${Gateway-Endpoint}:${Port-Number}.${Gateway-Endpoint}dan${Port-Number}adalah nama domain dan port kustom dari Gateway URL yang Anda peroleh pada Langkah 3.client_id
(Opsional) ID klien. ID harus berupa nilai kustom hingga 64 karakter. Gunakan alamat MAC atau nomor seri (SN) perangkat agar lebih mudah mengidentifikasi klien.
ssl_opts.trustStore
Jalur ke file sertifikat root sisi perangkat
root-ca.crt.ssl_opts.privateKey
Jalur ke file kunci sisi perangkat
client.key.ssl_opts.keyStore
Jalur ke file sertifikat sisi perangkat
client.crt.conn_opts.username
Username untuk koneksi MQTT.
Username harus terdiri dari 4 hingga 32 karakter dan dapat berisi huruf, angka, tanda hubung (-), garis bawah (_), tanda at (@), titik (.), dan titik dua (:). Username harus unik dalam produk tersebut.
conn_opts.password
Password untuk koneksi MQTT.
Password harus terdiri dari 1 hingga 32 karakter dan dapat berisi huruf, angka, tanda hubung (-), garis bawah (_), tanda at (@), titik (.), dan titik dua (:).
Setelah menyelesaikan langkah-langkah di atas, direktori Anda berisi file-file berikut:
build
paho.mqtt.c
aiot_mqtt_demo.c
client.crt
client.csr
client.key
openssl.cnf
root-ca.crt
root-ca.key
server.crt
server.csr
server.key
Langkah 5: Kompilasi dan jalankan
-
Jalankan perintah berikut untuk mengompilasi dan menjalankan file program perangkat
aiot_mqtt_demo.c:gcc -o aiot_mqtt_demo aiot_mqtt_demo.c -lpaho-mqtt3cs ./aiot_mqtt_demoSetelah program berhasil dijalankan, deviceName (
Client_123) yang dikembalikan oleh fungsi otentikasi FC digunakan sebagai DeviceName untuk perangkat di Platform IoT. Perangkat bernamaClient_123secara otomatis dibuat di halaman Device Management > Devices instans Anda di Konsol Platform IoT. Status perangkat adalah Online. -
(Opsional) Untuk melihat data yang dilaporkan oleh perangkat, buka Konsol Platform IoT dan lihat halaman Monitoring and Operations > Device Log instans Anda. Buka Monitoring and Operations > Device Log lalu klik tab Cloud Runtime Log. Dari daftar drop-down Product, pilih produk gerbang. Di kolom Actions, klik View. Di kotak dialog View Details, pastikan Topik adalah
/user/aiot_mqtt_demo_uprawdan kontennya adalahHello Service!. Status 200 menegaskan bahwa pesan berhasil dilaporkan.