全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 钉钉智能硬件
阿里云物联网套件

杭州节点MQTT设备认证

更新时间:2017-10-24 14:21:33

杭州节点 (本节点不再扩展功能,建议使用华东节点)

设备认证流程

  1. 下载IOT根证书 pubkey_CA (点击下载), 建议使用TLS1.2
  2. 指定阿里云MQTT服务器地址 (参考demo) 进行通信
  3. 我们采用TLS单向认证建立连接,客户端验证服务器通过CA证书完成,而服务器验证客户端通过MQTT协议体内connect报文中的username=MD5(productKey+productSecret+deviceName+deviceSecret)。 这个username签名算法取决于clientId中signMethod设置,目前默认MD5。 注意,如果您使用MQTT客户端,需要调整tls连接方式为单向认证。
  4. 标志唯一设备身份:Connect协议中的clientId设置格式productKey:deviceId/deviceName:deviceType:sdkVersion:signMethod ,比如 123:0axsdf:1:1.0.0,如果您的设备名称含有:号,那么请使用deviceId来避免冲突。deviceType为0代表第二字段为deviceId,为1代表deviceName。
  5. 安全性及其它:TLS + 设备id和签名 双重保护,即使黑客破解一个设备,不影响其它设备, 后续会提供更丰富签名类型。 同时,目前服务器对每个设备有流控,每秒最大的上报消息QPS=10.

注意: 设备相关的参数可以在 iot.console.aliyun.com ,获取产品证书和设备证书 productKeyproductSecretdeviceNamedeviceSecret 详细请参考控制台使用手册中的创建产品添加设备

目前支持的消息QOS 为 0,1,由于2在设备端开销过大,目前暂不支持,您可以基于QOS1的消息然后自己本地根据消息ID去重可以达到QOS2相类似的效果。

(可选)证书更新以及服务器动态寻址服务

注意:如果您使用MQTT域名方式接入,此步骤可忽略

此服务提供最新CA证书提取功能,以及动态返回IOT最优MQTT LVS接入ip,适用于没有DNS解析能力的设备或者需要指定阿里云特定ip的设备。如果设备端没有DNS能力,那么您需要使用自己服务器端去调用,并且更新到设备。实现方式:

  • 设备端或服务器端发送一个HTTP GET/POST请求到http(s)://iot-auth.aliyun.com/iot/auth, 参数如下:

    参数名 是否必传 描述
    deviceName 必须 用户注册设备自定义的名称,简称设备名称, 例如:b15f5e5063064fffaccc1e56ad59c29
    productKey 必须 用户在阿里云IoT控制台上创建的产品的productKey, 例如: 12345
    sign 必须 签名参数计算的规则如下:
    1. 将所有提交给服务器的参数(sign除外), 按照字母顺序排序, 然后将参数值依次拼接起来. 例如:deviceNameb15f5e5063064fffaccc1e56ad59c29productKey123456signMethodMD5... 假定变量名content
    2. 然后在对这个拼接之后的值(content)进行Hmac签名, 加密使用的key = productSecret+deviceSecret.
    3. 得到结果转16进制字符串并转大写 例如:DF2F6A209E06D25FA154DBE9771ED987
    4. 如果使用MD5,sign=md5(productSecret+content+deviceSecret),最后转大写
    signMethod 可选 签名算法,HmacMD5(默认) 或 HmacSHA1 或 MD5
    resFlag 可选 返回结果类型,默认all,可选 cert:只返回证书,ip:只返回MQTT服务器地址
    time 可选 时间戳, yyyy-MM-dd hh:mm:ss 格式
  • 服务器返回json结构:

{“servers”:”8.8.8.8:8080|8001”,”pubkey”:”pem key经过base64的字符串”,”pkVersion”:”1.0”,”deviceId”:”设备对应阿里云的全局设备id”,”success”:true,”sign”:”服务器签名”}

  1. 获得到的公钥证书需要base64decode,结果是一个pem格式的字符串(x509证书),其中pkVersion是当前证书版本.
  2. 其中servers是用于MQTT连接的数据通道服务器地址,端口有多个选择
  3. 至此, 设备端已经完成了认证和获取接入服务器的ip地址,下一步请参考设备接入,进行mqtt通信。
  4. 服务器返回的sign使用以上一致的签名策略对servers、pubkey、pkVersion参数(success除外)签名,供客户端验证(防止dns劫持风险),证书和数据服务器ip可以缓存客户端,注意ip可能会变化,当设备连接不上时需要重新认证获取最新配置。
  • 错误码

    • 当有异常时返回json错误格式:
      1. {"errorCode":"InvalidSign","message":"illegle sign!","success":false}
      • 其中errorCode有: InvalidSign:签名错误,InvalidPara:参数错误,Reject:非法请求,Unknow:系统异常
本文导读目录