
# 密钥鉴权
#### 概述
MQTT(S)协议-密钥鉴权是指设备在接入物联网平台时，携带设备ID和密钥以完成设备的接入鉴权。对于使用MQTTS协议接入的设备，需要在设备侧预置CA证书；对于使用MQTT非安全协议接入的设备，无需在设备侧预置CA证书。
#### 使用MQTT(S)协议-密钥接入的鉴权流程
图1MQTT(S)协议-密钥接入鉴权流程图   
![](https://support.huaweicloud.com/devg-iothub/figure/zh-cn_image_0000002305088926.png "点击放大")
1. 通过调用注册接口向物联网平台发送注册请求，或者在控制台上注册设备。
   ![](https://support.huaweicloud.com/devg-iothub/public_sys-resources/note_3.0-zh-cn.png)
   注册时需要填写设备标识码，通常使用MAC地址，Serial No或IMEI作为nodeId。
   
2. 物联网平台向设备分配全局唯一的设备ID （deviceId）和密钥（secret）。
   ![](https://support.huaweicloud.com/devg-iothub/public_sys-resources/note_3.0-zh-cn.png)
   密钥可以在注册设备时自定义，如果没有定义，平台将自动分配密钥。
   
3. 设备侧需集成预置CA证书[获取CA证书](https://support.huaweicloud.com/devg-iothub/iot_02_1004.html#section3)（仅针对MQTTS协议接入的鉴权流程）。
4. 设备登录时，携带设备ID（deviceId）和密钥（secret）发起接入鉴权请求。
5. 平台验证通过后，返回成功响应，设备连接物联网平台成功。
 
#### 密钥鉴权使用说明
本章说明以使用MQTT.fx工具激活在物联网平台上注册的设备为例，说明具体操作。
1. 下载[MQTT.fx](https://iotda-document.obs.cn-north-4.myhuaweicloud.com/mqttfx-1.7.1-windows-x64.exe)（默认是64位操作系统，如果是32位操作系统，单击此处下载[MQTT.fx](https://iotda-document.obs.cn-north-4.myhuaweicloud.com/mqttfx-1.7.1-windows.exe)），安装MQTT.fx工具。
2. 进入设备信息页面，单击MQTT连接参数，查看设备的连接信息（ClientId、Username、Password）。
   
   图2设备-连接参数   
   ![](https://support.huaweicloud.com/devg-iothub/figure/zh-cn_image_0000002286002104.png "点击放大")
   您也可以访问[参数生成工具](https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/)，填写注册设备后生成的设备ID（device_id）和密钥（secret），生成设备连接鉴权所需的参数（ClientId、Username、Password）。
   表1参数说明 
   | 参数       | 是否必选 | 类型     | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
   |:---|:---|:---|:---|
   | ClientId | 是    | String | **参数解释：** 一机一密的设备ClientId由4个部分组成：设备ID、设备身份标识类型、密码签名类型、时间戳，通过下划线"_"分隔。 - **设备ID**：指设备在平台成功注册后生成的唯一设备标识，通常由设备的产品ID和设备的NodeId通过分隔符"_"拼装而来。  - **设备身份标识类型**：固定值为0，表示设备ID。  - **密码签名类型** ：长度1字节，当前支持2种类型： - "0"代表HMACSHA256不校验时间戳。  - "1"代表HMACSHA256校验时间戳。    - **时间戳**：为设备连接平台时的UTC时间，格式为YYYYMMDDHH，如UTC 时间2018/7/24 17:56:20 则应表示为2018072417。   **取值范围**： 长度不超过256。 |
   | UserName | 是    | String | **参数解释**： UserName在此处即为设备ID（device_id）。 **取值范围：** 长度不超过256。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
   | Password | 是    | String | **参数解释**： Password是使用了"HMACSHA256"算法，以secret为内容，时间戳（格式为：YYYYMMDDHH）为密钥，进行加密后获取的值（secret为注册设备时平台返回的secret）。Password = hmacsha256("secret", "时间戳")。 当设备认证类型使用密钥认证接入（SECRET）需填写"Password"，X.509证书认证接入（CERTIFICATES）不需填写"Password"。 "HMACSHA256"即使用SHA-256生成哈希值的HMAC算法，生成的哈希值通用一个长度为64位的十六进制字符串来表示。例如，设备密码为：12345678；时间戳为：2025041401；那么，HMACSHA256后的值为："c75150e6cb841417396819e4d2ee4358a416344a03a083e3a8567074ddec820a"。 **取值范围：** 长度不超过256。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
      
   设备通过MQTT协议的connect消息进行鉴权，对于构造clientId的各个部分信息都必须包括进去，平台收到connect消息时，会判断设备的鉴权类型和密码摘要算法。
   使用生成工具生成的clientId格式，默认不校验时间戳：设备ID_0_0_时间戳。
   - 当采用"HMACSHA256"校验时间戳方式时，会先校验消息时间戳与平台时间是否一致，再判断密码是否正确。
   
   - 当采用"HMACSHA256"不校验时间戳方式时，鉴权消息也必须带时间戳，但不检验时间是否准确，仅判断密码是否正确。
   
   
   connect消息鉴权失败时，平台会返回错误，并自动断开MQTT链路。
   
   
3. 打开MQTT.fx软件，单击设置图标。 
   图3MQTT.fx软件-设置   
   ![](https://support.huaweicloud.com/devg-iothub/figure/zh-cn_image_0000002338968117.png "点击放大")
   
   
4. 参考下表配置鉴权参数，然后单击"Apply"。 
   图4连接信息配置   
   ![](https://support.huaweicloud.com/devg-iothub/figure/zh-cn_image_0000002305248618.png "点击放大")
   
   | 参数名称           | 说明                                                                                                                                                                                                                                              |
   |:---|:---|
   | Broker Address | 填写从设备接入服务控制台获取的[平台对接信息](https://support.huaweicloud.com/devg-iothub/iot_02_1004.html#section0)，此接入地址为域名信息。不能通过域名接入的设备，通过在cmd命令框中执行"ping 域名"获取IP地址，用IP地址接入平台。由于IP地址不固定，您需要将IP地址做成可配置项。                                                           |
   | Broker Port    | 默认为1883，使用MQTT非加密协议。若用户想使用MQTTS加密协议，则需改为8883，并参考[证书资源](https://support.huaweicloud.com/devg-iothub/iot_02_1004.html#section3)获取校验平台身份的证书。具体配置操作说明可参考[MQTT.fx模拟智慧路灯与平台通信](https://support.huaweicloud.com/qs-iothub/iot_05_00121.html#section8)。 |
   | Client ID      | 设备clientID，请参考[2]中获取。                                                                                                                                                                            |
   | User Name      | 即设备ID，请参考[2]中获取。                                                                                                                                                                                 |
   | Password       | 加密后的设备密钥，请参考[2]中获取。                                                                                                                                                                              |
      
   
   
5. 单击"Connect"，设备鉴权成功后，在物联网平台可以看到设备处于在线状态。 
   图5设备在线   
   ![](https://support.huaweicloud.com/devg-iothub/figure/zh-cn_image_0000001981327513.png "点击放大")
   
   
 
#### 相关最佳实践
[在线开发MQTT协议的模拟智慧路灯](https://support.huaweicloud.com/bestpractice-iothub/iot_bp_00016.html)
