设备认证
设备接入物联网平台之前,需通过身份认证。目前,阿里云物联网平台支持使用设备密钥、ID²和X.509证书进行设备身份认证。
设备密钥认证
阿里云物联网平台创建产品时,认证方式选择为设备密钥,然后在该产品下添加设备,获取物联网平台颁发的ProductSecret、DeviceSecret等密钥。设备接入物联网平台时,会使用物联网平台颁发的密钥信息,进行身份认证。
针对不同的使用环境,物联网平台提供以下四种设备密钥认证方案。
- 一机一密:每台设备烧录自己的设备证书(ProductKey、DeviceName和DeviceSecret)。
- 一型一密预注册:同一产品下设备烧录相同产品证书(ProductKey和ProductSecret)。开通产品的动态注册功能,设备通过动态注册获取DeviceSecret。
- 一型一密免预注册:同一产品下设备烧录相同产品证书(ProductKey和ProductSecret)。开通产品的动态注册功能,通过动态注册,设备不获取DeviceSecret,而是获取ClientID与DeviceToken的组合。
- 子设备动态注册:网关连接上云后,子设备通过动态注册获取DeviceSecret。
一机一密
一机一密认证,是预先为每个设备烧录其唯一的设备证书(ProductKey、DeviceName、DeviceSecret)。当设备与物联网平台建立连接时,物联网平台对其携带的设备证书信息进行认证。认证通过后,设备完成激活,然后与物联网平台进行通信。一机一密认证方式的安全性较高,推荐使用。
认证流程
设备通过 MQTT 和 HTTPS 协议注册认证。这里介绍 MQTT 认证流程。以下是 MQTT 连接的参数。
参数 |
说明 |
接入域名 |
公共实例和企业版实例中,MQTT的接入域名,请参见查看实例终端节点。 |
可变报头(variable header):Keep Alive |
CONNECT指令中需包含Keep Alive(保活时间)。保活心跳时间取值范围为30秒~1200秒,建议取值300秒以上。若网络不稳定,请将心跳时间设置长一些。如果心跳时间不在保活时间内,物联网平台会拒绝连接。更多说明,请参见下文MQTT保活。 |
MQTT的CONNECT报文参数 |
一机一密、一型一密预注册认证方式:使用设备证书(ProductKey、DeviceName和DeviceSecret)连接。 mqttClientId: clientId+”|securemode=3,signmethod=hmacsha1,timestamp=132323232|” mqttUsername: deviceName+”&”+productKey mqttPassword: sign_hmac(deviceSecret,content)
注意 此处productKey和deviceName为必填参数,timestamp和clientId为可选参数。若传入timestamp或clientId,必须与mqttClientId中的设置相同。 示例:假设clientId = 12345,deviceName = device, productKey = pk, timestamp = 789,signmethod=hmacsha1,deviceSecret=secret,那么使用TCP方式提交给MQTT的参数如下: mqttclientId=12345|securemode=3,signmethod=hmacsha1,timestamp=789| mqttUsername=device&pk mqttPassword=hmacsha1(“secret”,”clientId12345deviceNamedeviceproductKeypktimestamp789″).toHexString(); 加密后的Password为二进制转16制字符串,示例结果为: FAFD82A3D602B37FB0FA8B7892F24A477F85**** MQTT签名参数计算方法,请参见如何计算MQTT签名参数。 |
一型一密免预注册认证方式:使用ProductKey、DeviceName、ClientID、DeviceToken连接。 mqttClientId: clientId+”|securemode=-2,authType=connwl|” mqttUsername: deviceName+”&”+productKey mqttPassword: deviceToken
|
详细设计
方案设计
采用 EMQX 认证功能实现设备一机一密认证流程。设备使用 mqtt 协议向 emqx-broker 发起连接连接,带上连接参数(mqttClientId、mqttUsername、mqttPassword),emqx 中的 emqx-auth-http 插件负责将请求转发到业务服务的鉴权接口,鉴权接口实现对应的业务处理,返回 emqx-auth-http 处理结果。
实施落地
emqx-auth-http
关于 emqx-auth-http 可以查看 HTTP 认证 | EMQX 4.4 文档 文章介绍,这里不做赘述。
修改 emqx 目录 etc/plugins/emqx_auth_http.conf 中的配置,并在 dashborad 中启动该插件。
# etc/plugins/emqx_auth_http.conf
## 这里替换成 http-server提供的认证接口
auth.http.auth_req = http://127.0.0.1:80/mqtt/auth
## HTTP 请求方法
## Value: post | get | put
auth.http.auth_req.method = post
## 认证请求的 HTTP 请求头部,默认情况下配置 Content-Type 头部。
## Content-Type 头部目前支持以下值:application/x-www-form-urlencoded,application/json
auth.http.auth_req.headers.content-type = application/x-www-form-urlencoded
## 请求参数
auth.http.auth_req.params = clientid=%c,username=%u,password=%P
http-service
- 业务上设计对应的产品管理功能、设备管理管理,设备属于某个产品。创建设备,将设备的 ProductKey、DeviceName、DeviceSecret 存储到数据库中,并且同步到 redis 中。
- /mqtt/auth 接口负责根据入参,从 redis 中获取对应 ProductKey、DeviceName 的设备参数,进行对应的加密,判断是否和 mqttPassword 相同,匹配则放回 200,否则返回非 200。
总结
EMQX 除了提供 http 认证模式之外,还提供了 Mnesia 认证、JWT (opens new window)认证、LDAP 认证等认证方式。之所以选择 http 认证模式,原因如下:
- 实现相对其他方式来说比较简单;只需要提供 Restful API 即可;
- 其他的方式涉及到在配置文件中编写 sql,一旦修改需要重启服务;
- http 认证 只需要入参和出参保持不变即可,业务可做扩展。
本文章来源于互联网,如有侵权,请联系删除!原文地址:EMQX 实现 阿里云一机一密 认证
一、云端设置 首先登陆华为云: 进入控制台,设备接入IOT DA https://www.huaweicloud.com/product/iothub.html 点击“管理控制台” 点击产品 点击右上角“创建产品” 点击“确定” 点击“查看详情” 点击“自定义…