常见问题

IoT设备身份认证的常见问题和对应的方案。

1. ID²有效期的问题:

  • ID²的到期时间取决于首次调用ID²服务的时间+ID²授权的有效期,每台设备的ID²到期时间均不相同(如2022.04.01激活,1年有效期,2023.04.01过期)。

  • ID²到期前您可以在设置>授权>授权详情>IoT设备身份认证 页面中设置自动续期策略>自定义,在对应的产品下开启自动续期。ID²到期后再次活跃会自动消耗ID²授权并续期。

  • 如果您未启用自动续期,ID²到期后将无法使用。

2. 哪些情况会消耗ID²授权额度?

  • 新设备首次调用ID²认证,会消耗1个ID²授权。

  • 存量设备擦除了设备端的ID²信息,会被视为新设备(使用新的ID²),会消耗1个ID²授权。

  • 开启按照自动续期策略的情况下,存量设备的ID²过期后,设备再次调用ID²的服务,会自动消耗1个ID²授权。

3. ID²-ID长度是否固定不变?

是的,固定长度24字节。

4. 生成的authCode第一次认证时返回失败?

请从以下五个方面检查:

  • 检查authCode的认证是否在有效时间内。

  • 检查发送到服务端的ID²是否正确。可调用id2_client_get_id接口,获取正确的ID²。

  • 如果采用挑战应答方式(challenge-response)认证,请确认传入ID² Client的参数challenge是从服务端获取的。

  • 如果采用时间戳方式认证,请确认传入ID² Client接口的时间戳精度为毫秒级,否则会因为时间戳重复导致认证失败。

  • 检查irot_pal_get_random接口产生随机数的随机性。​

5. extra的用途是什么,是否需要设置extra参数?

extra参数最大长度支持512字节。extra参数用于验证设备端发送给服务端的数据的完整性,在此场景下需要设置,否则传入NULL即可。若设备端生成authCode时使用了extra参数,那么sp server认证ID² server时也要设置extra参数。

6. 为什么解密数据返回失败?

ID²设备端为一机一密,每个设备密钥不同,输入的密文数据也会不同。需要使用ID² Server加密后再交给设备端解密。

7. ID²认证服务返回错误的问题:

客户自建服务调用ID²云端接口,返回错误时,可根据返回的错误码进行排查和解决:

  • 错误码"12":ID²已激活到其他产品中,在此产品中,不可再用。

  • 错误码"16":ID²配额不足,需购买ID²配额,且分配ID²配额到此产品下。

  • 错误码"18":ID²不存在,ID²服务没有此ID²记录,设备存在非法的ID²,需先清除此ID²。

  • 错误码"21":认证码无效,挑战字无效(挑战字认证模式,挑战字只能使用一次)或时间戳过期(时间戳认证模式,设备端需做时间校准,时间偏差小于10分钟)

  • 错误码"32":ID²未激活,使用此功能前,需先最少一次ID²设备认证,完成ID²的激活。

  • 错误码"35":挑战无效,挑战字不是ID²服务下发,或者已过期(使用过一次)。

  • 错误码"50":ID²已过期,需购买ID²配额,进行ID²续期。

8. 设备端ID²初始化失败的问题:

当调用ID² 初始化失败时,说明ID² HAL接口适配(ID²软件沙箱载体)有问题:

<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.

针对此问题,可根据ID² HAL接口说明和参考实现进行排查,并使用ID² HAL测试工具(hal_app),进行验证(需通过全部测试用例)。

9. 设备端获取ID²认证码失败的问题:

当可读取出ID²-ID,但获取ID²认证码出现"bad plain key intergrity hash"错误信息,如下:

<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.

此错误由设备标识ID(适配接口ls_hal_get_dev_id)变化导致,ID²-KM(软件沙箱载体),使用设备硬件ID作为加密派生因子,需在同设备上保证设备ID不变。

10. ID²-iTLS连接出现获取OTP认证码错误的问题:

设备上ID²-iTLS建连失败时,在获取设备端OTP认证码,出现"invalid input args"的问题:

image.png

此问题,由填写的Product Secret不正确导致(ID² Product Secret - 固定32字节的字符串),您需要从以下两个点进行检查:

11. ID²-iTLS连接失败的问题:

设备上ID²-iTLS建连失败时,iTLS消息警告(alert message)返回ID²服务端的错误信息,可根据此进行问题排查和解决:

<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

错误日志中,"got an alert message, type: [2:160]" - 160代表返回的ID²错误信息,常见错误和解决方式如下:

  • "160":通用的错误,检查Product Secret是否正确(可在ID²产品详情下查看)。

  • "161":ID²配额不足,需新增ID²配额分配到此产品下。

  • "162":ID²不存在,服务端识别不了此ID²,可删除设备上ID²(如KM载体)后,重新空发ID²。

  • "163":认证码无效,挑战字无效(挑战字认证模式)或时间戳格式错误(时间戳认证模式,10进制字符串格式,如“162345678”)。

  • "164":ID²未激活,使用此功能前,需先最少一次ID²认证,完成ID²的激活。

  • "166":挑战无效,挑战字不是ID²服务下发,或者已过期(使用过一次)。

  • "170":ID²已绑定其他产品,不容许在该产品使用;改回绑定的产品,或者删除设备上的ID²,再重新空发一个新的ID²

  • "172":产品PK不存在;在物联网平台(LP)申请产品时,没有选择"ID²认证方式";或者,此时PK不存在。

12. 物联网平台的ID²密钥类型固定是AES,如何切换成其他密钥类型:

  • 登录IoT设备身份认证控制台

  • 查找ID²产品(常规>资产>设备,单击产品列表):

  • 点击产品右侧的详情按钮,进入产品详情页面:

  • 点击更换按钮,选择需要的ID²密钥类型。

    • 更换成功后,复制ID²产品的ProductKey和ID²动态下发Token(即ProductSecret)。

13. 使用物联网平台,通过ID²-iTLS上云MQTT认证失败问题

ID²-iTLS连接成功(“success to establish itls connection”),但MQTT认证失败("MQTT authorize fail"), 错误日志如下:

image.png

在使用LP企业版实例时,需在mqttclient中增加实例ID。登录物联网平台控制台,在实例概览页面查看实例ID。配置LP_Instance_ID变量(demos/mqtt_id2_demo.c)为实例ID的字符串(如“iot-12345678”):

14. 使用物联网平台,通过ID²-iTLS上云MQTT连接失败问题:

ID²-iTLS连接成功(“success to establish itls connection”),但MQTT连接失败("aiot_mqtt_connect"), 错误日志如下:

image.png

  • ID²产品排查:

登录IoT设备身份认证控制台,在左侧导航栏,单击常规>资产>设备>产品列表。确认使用的ID²产品是在物联网平台创建;如产品来源“ID² 平台”,需重新到物联网平台创建产品,且更换设备上的ID²信息。

  • LP实例ID配置排查:

登录IoT设备身份认证控制台,在左侧导航栏,单击常规>资产>设备>产品列表,找到使用的ID²产品,单击右侧的详情按钮。

LP公共实例(实例ID显示“-”):打开demos/mqtt_id2_demo.c,确认配置LP_Instance_ID为NULL

LP企业实例(实例ID显示字符串,如“iot-123456”):打开demos/mqtt_id2_demo.c,确认配置LP_Instance_ID为字符串"iot-123456"。

15. 调用ID²云端API,出现AccessKeyId异常的问题:

  • MissingAccessKeyId:

image.png

  • 此异常由没有配置阿里云AccessKey导致,请到配置文件中完成阿里云AccessKey信息的填写

  • InvalidAccessKeyId.NotFound:

image.png

  • 此异常由配置的阿里云AccessKey错误导致,请检查填写的阿里云AccessKey和AccessSecret的字符串是否正确