MQTT-TLS連接通信
MQTT-TLS是基于TLS協(xié)議的MQTT連接,設(shè)備和物聯(lián)網(wǎng)平臺(tái)使用發(fā)布/訂閱模式的MQTT進(jìn)行通信,TLS協(xié)議可以加密通信過(guò)程,確保數(shù)據(jù)的安全性。
背景信息
在進(jìn)行MQTT CONNECT協(xié)議設(shè)置時(shí),需注意:
如果同一個(gè)設(shè)備證書(shū)(ProductKey、DeviceName和DeviceSecret)或同一組ProductKey、DeviceName、ClientID、DeviceToken同時(shí)用于多個(gè)物理設(shè)備連接,可能會(huì)導(dǎo)致客戶端頻繁上線、離線。因?yàn)樾略O(shè)備連接認(rèn)證時(shí),原設(shè)備會(huì)被迫離線,而設(shè)備被離線后,又會(huì)自動(dòng)嘗試重新連接。
MQTT連接模式中,設(shè)備端Link SDK斷開(kāi)后會(huì)自動(dòng)重連。您可以通過(guò)日志服務(wù)查看設(shè)備行為。
MQTT客戶端直連
設(shè)備使用TCP接入的安全風(fēng)險(xiǎn)非常高,新建的企業(yè)版實(shí)例默認(rèn)關(guān)閉TCP(非TLS加密)接入方式。
為保障通信安全,需使用TLS加密的連接方式。
設(shè)備端Link SDK已配置TLS加密,您無(wú)需自行配置。
若您自行開(kāi)發(fā)設(shè)備端,需要使用根證書(shū)完成對(duì)物聯(lián)網(wǎng)平臺(tái)的鑒權(quán)。目前有兩套根證書(shū):
推薦: 阿里云物聯(lián)網(wǎng)平臺(tái)自簽名證書(shū),該CA根證書(shū)有效期到2053年07月04日,連接8883端口。
重要您可以使用MD5:
c7a6afb466713832af778a7bcb6d1aef
校驗(yàn)證書(shū)文件,確保證書(shū)文件的完整性和正確性。Global Sign R1根證書(shū),該CA根證書(shū)有效期到2028年01月28日,連接1883端口。證書(shū)失效后將無(wú)法再用于校驗(yàn)服務(wù)器。因此,請(qǐng)確保所有使用TLS加密的設(shè)備,均具備更新CA根證書(shū)的功能。
使用MQTT客戶端連接服務(wù)器。
連接方式,請(qǐng)參見(jiàn)開(kāi)源MQTT客戶端。 MQTT協(xié)議的更多信息,請(qǐng)參見(jiàn) MQTT官方文檔 。
說(shuō)明若使用第三方代碼,阿里云不提供技術(shù)支持。
MQTT連接時(shí)的參數(shù)說(shuō)明。建議您使用設(shè)備端SDK接入物聯(lián)網(wǎng)平臺(tái),以C語(yǔ)言為例,請(qǐng)參見(jiàn)MQTT接入。如果您自行開(kāi)發(fā)接入,連接參數(shù)如下。
參數(shù)
說(shuō)明
接入域名
公共實(shí)例和企業(yè)版實(shí)例中,MQTT的接入域名,請(qǐng)參見(jiàn)查看和配置實(shí)例終端節(jié)點(diǎn)信息(Endpoint)。
可變報(bào)頭(variable header):Keep Alive
CONNECT指令中需包含Keep Alive(保活時(shí)間)。保活心跳時(shí)間取值范圍為30秒~1200秒,建議取值300秒以上。若網(wǎng)絡(luò)不穩(wěn)定,請(qǐng)將心跳時(shí)間設(shè)置長(zhǎng)一些。如果心跳時(shí)間不在保活時(shí)間內(nèi),物聯(lián)網(wǎng)平臺(tái)會(huì)拒絕連接。
更多說(shuō)明,請(qǐng)參見(jiàn)下文MQTT保活。
MQTT的CONNECT報(bào)文參數(shù)
一機(jī)一密、一型一密預(yù)注冊(cè)認(rèn)證方式:使用設(shè)備證書(shū)(ProductKey、DeviceName和DeviceSecret)連接。
mqttClientId: clientId+"|securemode=3,signmethod=hmacsha1,timestamp=132323232|" mqttUsername: deviceName+"&"+productKey mqttPassword: sign_hmac(deviceSecret,content)
mqttClientId:格式中
| |
內(nèi)為擴(kuò)展參數(shù)。clientId:表示客戶端ID,可自定義,長(zhǎng)度不可超過(guò)64個(gè)字符。建議使用設(shè)備的MAC地址或SN碼,方便您識(shí)別區(qū)分不同的客戶端。
securemode:表示目前安全模式,可選值有2(TLS直連模式)和3(TCP直連模式)。
signmethod:表示簽名算法類型。支持hmacmd5,hmacsha1和hmacsha256。
timestamp:表示當(dāng)前時(shí)間毫秒值,可以不傳遞。
mqttPassword:sign簽名需把提交給服務(wù)器的參數(shù)按字典排序后,根據(jù)signmethod加簽。簽名計(jì)算示例,請(qǐng)參見(jiàn)MQTT連接簽名示例。
content的值為提交給服務(wù)器的參數(shù)(productKey、deviceName、timestamp和clientId),按照參數(shù)名稱首字母字典排序, 然后將參數(shù)值依次拼接。
重要此處productKey和deviceName為必填參數(shù),timestamp和clientId為可選參數(shù)。若傳入timestamp或clientId,必須與mqttClientId中的設(shè)置相同。
示例:
假設(shè)
clientId = 12345,deviceName = device, productKey = pk, timestamp = 789,signmethod=hmacsha1,deviceSecret=secret
,那么使用TCP方式提交給MQTT的參數(shù)如下:mqttclientId=12345|securemode=3,signmethod=hmacsha1,timestamp=789| mqttUsername=device&pk mqttPassword=hmacsha1("secret","clientId12345deviceNamedeviceproductKeypktimestamp789").toHexString();
加密后的Password為二進(jìn)制轉(zhuǎn)16制字符串,示例結(jié)果為:
FAFD82A3D602B37FB0FA8B7892F24A477F85****
MQTT簽名參數(shù)計(jì)算方法,請(qǐng)參見(jiàn)如何計(jì)算MQTT簽名參數(shù)。
一型一密免預(yù)注冊(cè)認(rèn)證方式:使用ProductKey、DeviceName、ClientID、DeviceToken連接。
mqttClientId: clientId+"|securemode=-2,authType=connwl|" mqttUsername: deviceName+"&"+productKey mqttPassword: deviceToken
mqttClientId:格式中
| |
內(nèi)為擴(kuò)展參數(shù)。clientId、deviceToken:設(shè)備動(dòng)態(tài)注冊(cè)時(shí)獲得的ClientID、DeviceToken,請(qǐng)參見(jiàn)基于MQTT協(xié)議的設(shè)備動(dòng)態(tài)注冊(cè)。
securemode:表示目前安全模式,采用一型一密免預(yù)注冊(cè)時(shí),固定取值為-2。
authType:表示認(rèn)證方式,采用一型一密免預(yù)注冊(cè)時(shí),固定取值為connwl。
使用示例
使用開(kāi)源MQTT客戶端接入物聯(lián)網(wǎng)平臺(tái)的示例,請(qǐng)參見(jiàn):
MQTT保活
設(shè)備端在保活時(shí)間間隔內(nèi),至少需要發(fā)送一次報(bào)文,包括ping請(qǐng)求。
連接保活時(shí)間的取值范圍為30秒~1200秒。建議取值300秒以上。
從物聯(lián)網(wǎng)平臺(tái)發(fā)送CONNACK響應(yīng)CONNECT消息時(shí),開(kāi)始心跳計(jì)時(shí)。收到PUBLISH、SUBSCRIBE、PING或 PUBACK消息時(shí),會(huì)重置計(jì)時(shí)器。物聯(lián)網(wǎng)平臺(tái)每隔30秒定時(shí)檢測(cè)一次設(shè)備的保活心跳,設(shè)備上線時(shí)間點(diǎn)距離最新定時(shí)檢測(cè)時(shí)間點(diǎn)的時(shí)間,是定時(shí)檢測(cè)的等待時(shí)間。定義最大超時(shí)時(shí)間為:保活心跳時(shí)間*1.5+定時(shí)檢測(cè)的等待時(shí)間
。超過(guò)最大超時(shí)時(shí)間未收到設(shè)備消息,服務(wù)器會(huì)自動(dòng)斷開(kāi)連接。