一機一密概述
一機一密認證方法,即預先為每個設備申請唯一的訪問憑證(ClientId、DeviceAccessKeyId和DeviceAccessKeySecret)。當設備與云消息隊列 MQTT 版建立連接時,需要將設備訪問憑證中的信息按照約定的形式設置到Username和Password中,向云消息隊列 MQTT 版發起認證請求,云消息隊列 MQTT 版認證通過后激活設備,設備與云消息隊列 MQTT 版間才可傳輸數據。
名詞解釋
術語 | 說明 |
設備訪問憑證 | MQTT服務器為用戶客戶端頒發的訪問憑證,包含DeviceAccessKeyId和DeviceAccessKeySecret,與Client ID綁定并全局唯一。客戶端與云消息隊列 MQTT 版建立連接時,需要按照約定形式將設備訪問憑證中的DeviceAccessKeyId和DeviceAccessKeySecret設置到Username和Password中進行認證。 |
應用服務器 | 您管理本地賬號的服務器,用來替客戶端申請和管理設備訪問憑證服務的應用。 |
MQTT服務器 | 云消息隊列 MQTT 版權限認證和消息收發服務器,用來處理應用服務器發起的設備訪問憑證相關的請求以及消息收發業務。 |
計算方式
按照鑒權概述的描述,如果選擇一機一密鑒權模式,MQTT客戶端實際連接MQTT消息服務器時,connect報文中的Username和Password需要按照本文約定的規范設置,具體設置和計算方法如下:
Username
由鑒權模式名稱、DeviceAccessKeyId和InstanceId三部分組成,以豎線(|)分隔。一機一密模式下鑒權模式設置為DeviceCredential。
舉例:一個客戶端的Client ID是GID_Test@@@0001,使用的實例ID是mqtt-xxxxx,使用的DeviceAccessKeyId是YYYYY,則簽名模式的UserName應該設置成 DeviceCredential|YYYYY|mqtt-xxxxx。
Client ID的詳細說明請參見名詞解釋。
Password
對Client ID簽名的結果。具體計算方法如下:
舉例:一個客戶端的Client ID是GID_Test@@@0001,使用的DeviceAccessKeySecret是XXXXX。
用XXXXX作為密鑰,使用HMAC-SHA1方法對待簽名字符串GID_Test@@@0001做簽名計算得到一個二進制數組,再對該二進制數組做Base64編碼得到最終的Password字符串。
HMAC-SHA1的算法實現,各個語言都有現成的函數庫,請自行搜索。
使用流程
使用一機一密鑒權模式,您需要按照下圖所示的流程,部署您的應用服務器。而且在初始化時,MQTT客戶端需要具備與您的應用服務器交互(獲取和更新設備訪問憑證)的能力。
具體流程如下:
用戶應用服務器調用OpenAPI接口向MQTT服務器發起請求,預先為用戶客戶端申請設備訪問憑證。
MQTT服務器驗證申請設備訪問憑證的請求,判斷合法之后下發對應的設備訪問憑證。
應用服務器將返回的設備訪問憑證持久化到本地,對每個客戶端對應的訪問憑證進行映射。緩存設備訪問憑證有以下優勢:
只要客戶端側沒有發生憑證泄露等問題,設備訪問憑證就無需更換,此時可以直接返回緩存的設備憑證,避免申請憑證時接口調用的開銷。
客戶端重新申請設備訪問憑證時,如果MQTT服務器異常,應用服務器可以嘗試返回客戶端之前申請的設備訪問憑證以實現本地容災。
用戶應用服務器將申請好的設備訪問憑證下發給對應的MQTT客戶端。
MQTT客戶端按照規范將設備訪問憑證中的信息作為參數設置,連接MQTT服務器,服務端驗證通過后客戶端即可正常收發消息。
使用限制
實例規格約束
設備訪問憑證的配額與實例規格中的連接數對等,達到配額上限后將無法為新設備申請訪問憑證,您可以通過為實例升配提高訪問憑證的配額,具體操作,請參見實例續費和升降配。
使用一機一密認證方式時,對于不再使用的設備憑證,請您及時調用UnRegisterDeviceCredential接口注銷設備訪問憑證,以免占用訪問憑證的配額。
客戶端行為約束
必須按照約定形式將設備訪問憑證中的信息作為連接參數設置到Username和Password中,每次連接時上傳。
客戶端應該對應用服務器返回的設備訪問憑證做持久化,避免每次重連都申請一樣的設備訪問憑證,防止大批量客戶端同時連接壓垮應用服務器。
應用服務器行為約束
應用服務器應該對設備訪問憑證和客戶端的映射關系進行管理,避免同一個客戶端重復調用。
應用服務器需要做本地容災,避免因MQTT服務器訪問短暫不可用而導致業務阻塞的情況。
相關API
一機一密鑒權流程通過相關的API來完成。應用服務器負責設備訪問憑證的申請和管理,和云消息隊列 MQTT 版服務器之間通過HTTPS的OpenAPI進行交互。
每個接口都要求通過AccessKey和請求簽名做來做身份驗證。目前開放注冊、查詢、注銷和更新設備訪問憑證的接口。詳細接口信息,請參見一機一密應用服務器接口。