常見問題
IoT設(shè)備身份認(rèn)證的常見問題和對(duì)應(yīng)的方案。
1. ID2有效期的問題:
ID2的到期時(shí)間取決于首次調(diào)用ID2服務(wù)的時(shí)間+ID2授權(quán)的有效期,每臺(tái)設(shè)備的ID2到期時(shí)間均不相同(如2022.04.01激活,1年有效期,2023.04.01過期)。
ID2到期前您可以在設(shè)置>授權(quán)>授權(quán)詳情>IoT設(shè)備身份認(rèn)證 頁(yè)面中設(shè)置自動(dòng)續(xù)期策略>自定義,在對(duì)應(yīng)的產(chǎn)品下開啟自動(dòng)續(xù)期。ID2到期后再次活躍會(huì)自動(dòng)消耗ID2授權(quán)并續(xù)期。
如果您未啟用自動(dòng)續(xù)期,ID2到期后將無法使用。
2. 哪些情況會(huì)消耗ID2授權(quán)額度?
新設(shè)備首次調(diào)用ID2認(rèn)證,會(huì)消耗1個(gè)ID2授權(quán)。
存量設(shè)備擦除了設(shè)備端的ID2信息,會(huì)被視為新設(shè)備(使用新的ID2),會(huì)消耗1個(gè)ID2授權(quán)。
開啟按照自動(dòng)續(xù)期策略的情況下,存量設(shè)備的ID2過期后,設(shè)備再次調(diào)用ID2的服務(wù),會(huì)自動(dòng)消耗1個(gè)ID2授權(quán)。
3. ID2-ID長(zhǎng)度是否固定不變?
是的,固定長(zhǎng)度24字節(jié)。
4. 生成的authCode第一次認(rèn)證時(shí)返回失敗?
請(qǐng)從以下五個(gè)方面檢查:
檢查authCode的認(rèn)證是否在有效時(shí)間內(nèi)。
檢查發(fā)送到服務(wù)端的ID2是否正確。可調(diào)用id2_client_get_id接口,獲取正確的ID2。
如果采用挑戰(zhàn)應(yīng)答方式(challenge-response)認(rèn)證,請(qǐng)確認(rèn)傳入ID2 Client的參數(shù)challenge是從服務(wù)端獲取的。
如果采用時(shí)間戳方式認(rèn)證,請(qǐng)確認(rèn)傳入ID2 Client接口的時(shí)間戳精度為毫秒級(jí),否則會(huì)因?yàn)闀r(shí)間戳重復(fù)導(dǎo)致認(rèn)證失敗。
檢查irot_pal_get_random接口產(chǎn)生隨機(jī)數(shù)的隨機(jī)性。?
5. extra的用途是什么,是否需要設(shè)置extra參數(shù)?
extra參數(shù)最大長(zhǎng)度支持512字節(jié)。extra參數(shù)用于驗(yàn)證設(shè)備端發(fā)送給服務(wù)端的數(shù)據(jù)的完整性,在此場(chǎng)景下需要設(shè)置,否則傳入NULL即可。若設(shè)備端生成authCode時(shí)使用了extra參數(shù),那么sp server認(rèn)證ID2 server時(shí)也要設(shè)置extra參數(shù)。
6. 為什么解密數(shù)據(jù)返回失敗?
ID2設(shè)備端為一機(jī)一密,每個(gè)設(shè)備密鑰不同,輸入的密文數(shù)據(jù)也會(huì)不同。需要使用ID2 Server加密后再交給設(shè)備端解密。
7. ID2認(rèn)證服務(wù)返回錯(cuò)誤的問題:
客戶自建服務(wù)調(diào)用ID2云端接口,返回錯(cuò)誤時(shí),可根據(jù)返回的錯(cuò)誤碼進(jìn)行排查和解決:
錯(cuò)誤碼"12":ID2已激活到其他產(chǎn)品中,在此產(chǎn)品中,不可再用。
錯(cuò)誤碼"16":ID2配額不足,需購(gòu)買ID2配額,且分配ID2配額到此產(chǎn)品下。
錯(cuò)誤碼"18":ID2不存在,ID2服務(wù)沒有此ID2記錄,設(shè)備存在非法的ID2,需先清除此ID2。
錯(cuò)誤碼"21":認(rèn)證碼無效,挑戰(zhàn)字無效(挑戰(zhàn)字認(rèn)證模式,挑戰(zhàn)字只能使用一次)或時(shí)間戳過期(時(shí)間戳認(rèn)證模式,設(shè)備端需做時(shí)間校準(zhǔn),時(shí)間偏差小于10分鐘)
錯(cuò)誤碼"32":ID2未激活,使用此功能前,需先最少一次ID2設(shè)備認(rèn)證,完成ID2的激活。
錯(cuò)誤碼"35":挑戰(zhàn)無效,挑戰(zhàn)字不是ID2服務(wù)下發(fā),或者已過期(使用過一次)。
錯(cuò)誤碼"50":ID2已過期,需購(gòu)買ID2配額,進(jìn)行ID2續(xù)期。
8. 設(shè)備端ID2初始化失敗的問題:
當(dāng)調(diào)用ID2 初始化失敗時(shí),說明ID2 HAL接口適配(ID2軟件沙箱載體)有問題:
<LS_LOG> _load_id2_item 133: open rsvd part fail
<LS_LOG> km_init 385: load id2 id item fail
<LS_LOG> id2_client_init 915: ERROR: km init fail, ffff0000.
針對(duì)此問題,可根據(jù)ID2 HAL接口說明和參考實(shí)現(xiàn)進(jìn)行排查,并使用ID2 HAL測(cè)試工具(hal_app),進(jìn)行驗(yàn)證(需通過全部測(cè)試用例)。
9. 設(shè)備端獲取ID2認(rèn)證碼失敗的問題:
當(dāng)可讀取出ID2-ID,但獲取ID2認(rèn)證碼出現(xiàn)"bad plain key intergrity hash"錯(cuò)誤信息,如下:
<LS_LOG> KM ERR km_unwrap_blob 271: bad plain key intergrity hash
<LS_LOG> KM ERR blob_cipher 1029: unwrap blob failed
<LS_LOG> KM ERR km_blob_cipher 964: km blob cipher failed 0xffff0009
<LS_LOG> _id2_sym_cipher 156: ERROR: km cipher error, 0xffff0009.
<LS_LOG> _id2_sign 226: ERROR: id2 sym cipher fail, -1.
此錯(cuò)誤由設(shè)備標(biāo)識(shí)ID(適配接口ls_hal_get_dev_id)變化導(dǎo)致,ID2-KM(軟件沙箱載體),使用設(shè)備硬件ID作為加密派生因子,需在同設(shè)備上保證設(shè)備ID不變。
10. ID2-iTLS連接出現(xiàn)獲取OTP認(rèn)證碼錯(cuò)誤的問題:
設(shè)備上ID2-iTLS建連失敗時(shí),在獲取設(shè)備端OTP認(rèn)證碼,出現(xiàn)"invalid input args"的問題:
此問題,由填寫的Product Secret不正確導(dǎo)致(ID2 Product Secret - 固定32字節(jié)的字符串),您需要從以下兩個(gè)點(diǎn)進(jìn)行檢查:
登錄物聯(lián)網(wǎng)平臺(tái)控制臺(tái),確認(rèn)當(dāng)前產(chǎn)品(Product Key)是否選擇“ID2”認(rèn)證。
登錄IoT設(shè)備身份認(rèn)證控制臺(tái),確認(rèn)當(dāng)前產(chǎn)品(Product Key)對(duì)應(yīng)的產(chǎn)品密鑰(Product Secret)是否正確。
11. ID2-iTLS連接失敗的問題:
設(shè)備上ID2-iTLS建連失敗時(shí),iTLS消息警告(alert message)返回ID2服務(wù)端的錯(cuò)誤信息,可根據(jù)此進(jìn)行問題排查和解決:
<LS_LOG> mbedtls_write_key_id_ext 174: key is not provisioned, need to get key first!
<LS_LOG> mbedtls_ssl_handle_message_type 4194: got an alert message, type: [2:160]
<LS_LOG> hal_itls_establish_timeout 309: failed
! mbedtls_ssl_handshake returned -0x7780
<LS_LOG> itls_hal_sample 62: itls establish fail
錯(cuò)誤日志中,"got an alert message, type: [2:160]" - 160代表返回的ID2錯(cuò)誤信息,常見錯(cuò)誤和解決方式如下:
"160":通用的錯(cuò)誤,檢查Product Secret是否正確(可在ID2產(chǎn)品詳情下查看)。
"161":ID2配額不足,需新增ID2配額分配到此產(chǎn)品下。
"162":ID2不存在,服務(wù)端識(shí)別不了此ID2,可刪除設(shè)備上ID2(如KM載體)后,重新空發(fā)ID2。
"163":認(rèn)證碼無效,挑戰(zhàn)字無效(挑戰(zhàn)字認(rèn)證模式)或時(shí)間戳格式錯(cuò)誤(時(shí)間戳認(rèn)證模式,10進(jìn)制字符串格式,如“162345678”)。
"164":ID2未激活,使用此功能前,需先最少一次ID2認(rèn)證,完成ID2的激活。
"166":挑戰(zhàn)無效,挑戰(zhàn)字不是ID2服務(wù)下發(fā),或者已過期(使用過一次)。
"170":ID2已綁定其他產(chǎn)品,不容許在該產(chǎn)品使用;改回綁定的產(chǎn)品,或者刪除設(shè)備上的ID2,再重新空發(fā)一個(gè)新的ID2
"172":產(chǎn)品PK不存在;在物聯(lián)網(wǎng)平臺(tái)(LP)申請(qǐng)產(chǎn)品時(shí),沒有選擇"ID2認(rèn)證方式";或者,此時(shí)PK不存在。
12. 物聯(lián)網(wǎng)平臺(tái)的ID2密鑰類型固定是AES,如何切換成其他密鑰類型:
查找ID2產(chǎn)品(常規(guī)>資產(chǎn)>設(shè)備,單擊產(chǎn)品列表):
點(diǎn)擊產(chǎn)品右側(cè)的詳情按鈕,進(jìn)入產(chǎn)品詳情頁(yè)面:
點(diǎn)擊更換按鈕,選擇需要的ID2密鑰類型。
更換成功后,復(fù)制ID2產(chǎn)品的ProductKey和ID2動(dòng)態(tài)下發(fā)Token(即ProductSecret)。
13. 使用物聯(lián)網(wǎng)平臺(tái),通過ID2-iTLS上云MQTT認(rèn)證失敗問題
ID2-iTLS連接成功(“success to establish itls connection”),但MQTT認(rèn)證失敗("MQTT authorize fail"), 錯(cuò)誤日志如下:
在使用LP企業(yè)版實(shí)例時(shí),需在mqttclient中增加實(shí)例ID。登錄物聯(lián)網(wǎng)平臺(tái)控制臺(tái),在實(shí)例概覽頁(yè)面查看實(shí)例ID。配置LP_Instance_ID變量(demos/mqtt_id2_demo.c)為實(shí)例ID的字符串(如“iot-12345678”):
14. 使用物聯(lián)網(wǎng)平臺(tái),通過ID2-iTLS上云MQTT連接失敗問題:
ID2-iTLS連接成功(“success to establish itls connection”),但MQTT連接失敗("aiot_mqtt_connect"), 錯(cuò)誤日志如下:
ID2產(chǎn)品排查:
登錄IoT設(shè)備身份認(rèn)證控制臺(tái),在左側(cè)導(dǎo)航欄,單擊常規(guī)>資產(chǎn)>設(shè)備>產(chǎn)品列表。確認(rèn)使用的ID2產(chǎn)品是在物聯(lián)網(wǎng)平臺(tái)創(chuàng)建;如產(chǎn)品來源“ID2 平臺(tái)”,需重新到物聯(lián)網(wǎng)平臺(tái)創(chuàng)建產(chǎn)品,且更換設(shè)備上的ID2信息。
LP實(shí)例ID配置排查:
登錄IoT設(shè)備身份認(rèn)證控制臺(tái),在左側(cè)導(dǎo)航欄,單擊常規(guī)>資產(chǎn)>設(shè)備>產(chǎn)品列表,找到使用的ID2產(chǎn)品,單擊右側(cè)的詳情按鈕。
LP公共實(shí)例(實(shí)例ID顯示“-”):打開demos/mqtt_id2_demo.c,確認(rèn)配置LP_Instance_ID為NULL
LP企業(yè)實(shí)例(實(shí)例ID顯示字符串,如“iot-123456”):打開demos/mqtt_id2_demo.c,確認(rèn)配置LP_Instance_ID為字符串"iot-123456"。
15. 調(diào)用ID2云端API,出現(xiàn)AccessKeyId異常的問題:
MissingAccessKeyId:
此異常由沒有配置阿里云AccessKey導(dǎo)致,請(qǐng)到配置文件中完成阿里云AccessKey信息的填寫
InvalidAccessKeyId.NotFound:
此異常由配置的阿里云AccessKey錯(cuò)誤導(dǎo)致,請(qǐng)檢查填寫的阿里云AccessKey和AccessSecret的字符串是否正確