
# 设备自动注册安全接入示例
#### 场景说明
平台基于客户业务安全考虑，只有将设备的基本信息（例如设备ID、鉴权信息）注册到平台后，设备才能使用成功注册后的设备ID和鉴权信息接入物联网平台。当用户注册的设备不断增多时，如何安全且高效地注册设备变得尤为关键。
一种方案是，使用批量注册模板或者循环调用平台应用侧注册设备的API，实现高效地批量注册设备。此方案能够满足客户对批量注册设备的大部分场景需求，但要求客户业务应用侧和客户产线侧相互配合，客户应用侧对设备ID提前进行规划，应用侧完成批量注册后，客户业务产线侧需将应用侧获取到的设备ID逐一烧录到各个设备比较麻烦。
另一种更加高效的方案是，使用设备发放的注册组功能实现设备免注册安全极简地接入物联网平台。
本文基于设备发放注册组功能，使用证书策略，带您快速体验设备免注册安全极简接入物联网平台。
表1方案对比 
| 设备注册方案 | 基于单个注册                                                                                                                                                                                                                                                                                                                                                                                                | 批量注册                                                                                                                                                                                                                                                                                                                                                                                                                                                          | 免注册安全极简接入                                                                                                                                                                                                                                                                                                                                                                                                     |
|:---|:---|:---|:---|
| 适用场景   | - 设备数量不多；  - 对设备身份标识和认证信息可提前规划；  - 产线侧与应用侧可紧密配合。   | - 设备数量多；  - 对设备身份标识和认证信息可提前规划。                                                                                                                                                                                   | - 设备数量较多；  - 设备能力强；  - 对设备注册的灵活性要求高。                             |
| 过程     | 1. 应用侧通过多次调用单个注册API将设备信息（包括但不限于身份标识和认证信息）逐一注册到平台；  2. 产线侧与应用侧密切配合，将设备身份标识和与之对应的认证信息逐个写入设备。                                                          | 1. 下载并填写批量注册模板文件，定义设备信息（包括但不限于身份标识和认证信息）；  2. 将填写完成的批量注册模板文件上传至平台，完成批量注册过程；  3. 产线侧将设备身份标识和与之对应的认证信息逐个写入设备。   | 1. 基于设备发放的注册组和发放策略能力；  2. 具体过程在本文后续章节展开。                                                                                                              |
| 特点     | - 多次调用API；  - 整体流程简单。                                                                                                                                 | 将单个注册过程模板化。                                                                                                                                                                                                                                                                                                                                                                                                                                                   | - 无需对设备身份标识和认证信息提前规划；  - 应用侧无需逐一注册设备信息；  - 降低产线管理和维护成本。   |
   
#### 整体流程
通过注册组实现设备免注册极简接入平台操作流程图如下图所示。
图1注册流程   
![](https://support.huaweicloud.com/bestpractice-iotps/figure/zh-cn_image_0000001412007985.png "点击放大")
图2接入平台操作流程   
![](https://support.huaweicloud.com/bestpractice-iotps/figure/zh-cn_image_0000001411805309.png "点击放大")
 #### 制作CA证书
本文以Windows环境为例，介绍通过Openssl工具制作CA证书和验证证书的方法。
![](https://support.huaweicloud.com/bestpractice-iotps/public_sys-resources/caution_3.0-zh-cn.png)
以下"生成密钥对（rootCA.key）"和"生成CA证书（rootCA.crt）"为操作过程中需要使用到的两个文件。
具体步骤：
1. 在浏览器中访问[这里](https://slproweb.com/products/Win32OpenSSL.html)，下载并进行安装OpenSSL工具，安装完成后配置环境变量。
2. 在 D:\\certificates 文件夹下，以管理员身份运行cmd命令行窗口。
3. 生成密钥对（rootCA.key）： 
   ![](https://support.huaweicloud.com/bestpractice-iotps/public_sys-resources/note_3.0-zh-cn.png)
   生成"密钥对"时输入的密码在生成"证书签名请求文件"、"CA证书"，"验证证书"以及"设备证书"时需要用到，请妥善保存。
   ```
   openssl genrsa -des3 -out rootCA.key 2048
   ```
   
   
4. 使用密钥对生成证书签名请求文件： 
   ![](https://support.huaweicloud.com/bestpractice-iotps/public_sys-resources/note_3.0-zh-cn.png)
   生成证书签名请求文件时，要求填写证书唯一标识名称（Distinguished Name，DN）信息，参数说明如下[表1]所示。
    表2参数说明 
   | **提示**                                            | **参数名称**            | **取值样例**                      |
   |:---|:---|:---|
   | Country Name (2 letter code) \[\]:                | 国家/地区               | CN                            |
   | State or Province Name (full name) \[\]:          | 省/市                 | GuangDong                     |
   | Locality Name (eg, city) \[\]:                    | 城市                  | ShenZhen                      |
   | Organization Name (eg, company) \[\]:             | 组织机构（或公司名）          | Huawei Technologies Co., Ltd. |
   | Organizational Unit Name (eg, section) \[\]:      | 机构部门                | Cloud Dept.                   |
   | Common Name (eg, fully qualified host name) \[\]: | CA名称（CN）            | Huawei IoTDP CA               |
   | Email Address \[\]:                               | 邮箱地址                | /                             |
   | A challenge password \[\]:                        | 证书密码，如您不设置密码，可以直接回车 | /                             |
   | An optional company name \[\]:                    | 可选公司名称，如您不设置，可以直接回车 | /                             |
      
   ```
   openssl req -new -key rootCA.key -out rootCA.csr
   ```
   
   
5. 生成CA证书（rootCA.crt）： 
   ```
   openssl x509 -req -days 50000 -in rootCA.csr -signkey rootCA.key -out rootCA.crt
   ```
   ![](https://support.huaweicloud.com/bestpractice-iotps/public_sys-resources/note_3.0-zh-cn.png)
   "-days"后的参数值指定了该证书的有效天数，此处示例为50000天，您可根据实际业务场景和需要进行调整。
   
   
 
#### 上传CA证书
具体操作步骤
1. 登录[设备发放控制台](https://console.huaweicloud.com/iotdm/?region=cn-north-4&locale=zh-cn#/dm-portal/iotps/home)。
2. 在设备发放控制台，左侧导航窗格中，选择"证书"，单击右上方的"上传CA证书"。 
   图3上传CA证书   
   ![](https://support.huaweicloud.com/bestpractice-iotps/figure/zh-cn_image_0000001835989777.png "点击放大")
   
   
3. 在"上传CA证书"页面，填写"证书名称"，单击"添加文件"，上传此前"[制作CA证书]"步骤中生成的"CA证书（rootCA.crt文件）"，单击"确定"。
   
   图4上传CA证书详情页   
   ![](https://support.huaweicloud.com/bestpractice-iotps/figure/zh-cn_image_0000001789350320.png "点击放大")
   
   
![](https://support.huaweicloud.com/bestpractice-iotps/public_sys-resources/note_3.0-zh-cn.png)
上传的CA证书初始状态为"未验证"，需要完成"[验证CA证书]"过程，方可正常使用该CA证书。
表3证书状态表 
| CA证书状态 |                 说明                  |
|---|---|
| 已验证    | 可正常使用。                              |
| 未验证    | 不可正常使用，待验证通过后，方可正常使用。               |
| 已过期    | CA证书已过期，需更新，但不影响平台使用该CA证书验证对应的设备证书。 |
| 即将过期   | CA证书30天内即将过期，需及时更新。                 |
   
 #### 验证CA证书
对于已上传的CA证书，平台要求用户完成"验证CA证书"过程，以验证用户具备该CA证书的签发能力。
操作步骤
1. 登录[设备发放控制台](https://console.huaweicloud.com/iotdm/?region=cn-north-4&locale=zh-cn#/dm-portal/iotps/home)。
2. 在设备发放控制台，左侧导航窗格中，选择"证书"，单击"证书列表"条目的操作栏中的"验证证书"。 
   图5上传CA证书完成页   
   ![](https://support.huaweicloud.com/bestpractice-iotps/figure/zh-cn_image_0000001789190628.png "点击放大")
   
   
3. 在上传验证证书页面，单击"生成验证码"，单击"复制图标"复制此CA证书的随机验证码。 
   图6复制验证码   
   ![](https://support.huaweicloud.com/bestpractice-iotps/figure/zh-cn_image_0000001836109833.png "点击放大")
   ![](https://support.huaweicloud.com/bestpractice-iotps/public_sys-resources/note_3.0-zh-cn.png)
   CA证书验证码有效期为一天，请及时使用验证码生成验证证书并完成验证。
   验证码的生成为替换机制，即对于一个CA证书，即使此前的验证码未过期，也将被新生成的验证码替换。
   
   
4. 使用OpenSSL工具为验证证书生成密钥对。 
   ```
   openssl genrsa -out verificationCert.key 2048
   ```
   
   
5. 利用此验证码生成证书签名请求文件CSR。 
   ```
   openssl req -new -key verificationCert.key -out verificationCert.csr
   ```
   ![](https://support.huaweicloud.com/bestpractice-iotps/public_sys-resources/note_3.0-zh-cn.png)
   CSR文件的Common Name (e.g. server FQDN or YOUR name) 需要填写此验证码。
   
   
6. 使用CA证书、CA证书私钥和上一步骤中生成的CSR文件创建验证证书（verificationCert.crt）。 
   ```
   openssl x509 -req -in verificationCert.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out verificationCert.crt -days 36500 -sha256
   ```
   ![](https://support.huaweicloud.com/bestpractice-iotps/public_sys-resources/note_3.0-zh-cn.png)
   生成验证证书用到的"rootCA.crt"和"rootCA.key"这两个文件，为"[制作CA证书]"中所生成的两个文件。
   "-days"后的参数值指定了该证书的有效天数，此处示例为36500天，您可根据实际业务场景和需要进行调整。
   
   
7. 上传验证证书进行验证。 
   图7上传验证证书   
   ![](https://support.huaweicloud.com/bestpractice-iotps/figure/zh-cn_image_0000001835989781.png "点击放大")
   
   
 
#### 添加证书策略
1. 添加证书策略，发放CA证书到指定的IoTDA，并且由此CA签发的设备证书都会发放到指定的IoTDA。 
   图8添加证书策略   
   ![](https://support.huaweicloud.com/bestpractice-iotps/figure/zh-cn_image_0000001789384942.png "点击放大")
   
   
2. 进入"策略"界面，单击展开"证书策略"，单击"添加实例"。 
   图9添加证书策略详情   
   ![](https://support.huaweicloud.com/bestpractice-iotps/figure/zh-cn_image_0000002063413105.png "点击放大")
   
   
3. 按照下方参数说明填写关键参数信息后，单击"确定"。 
   表4参数信息 
   | 参数名称 | 说明                                                                                                                                                                          | 示例                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
   |:---|:---|:---|
   | 证书名称 | 即所要根据证书属性将设备发放到指定的目标区域，选择对应的证书。                                                                                                                                             | 将需要通过证书"certificates"发放的设备发放至华北-北京四的物联网平台。 - 需通过证书"certificates"发放的设备：WaterMeter-Beijing0001、WaterMeter-Beijing0002  - 证书名称：certificates  - 发放区域：华北-北京四  - 发放应用：beijing-app1   |
   | 发放区域 | 发放到指定区域后，设备将接入对应区域的设备接入服务。 所选区域未开通设备接入服务时，如果确定添加实例，系统将自动为您开通设备接入服务。不同区域设备接入服务价格不同，收费详情请参考价格说明。 | 将需要通过证书"certificates"发放的设备发放至华北-北京四的物联网平台。 - 需通过证书"certificates"发放的设备：WaterMeter-Beijing0001、WaterMeter-Beijing0002  - 证书名称：certificates  - 发放区域：华北-北京四  - 发放应用：beijing-app1   |
   | 发放应用 | 选择对应设备接入服务区域已创建的应用。在物联网平台中，设备由应用统一管理。 如果对应设备接入服务区域未创建应用，需要前往对应服务创建应用。                         | 将需要通过证书"certificates"发放的设备发放至华北-北京四的物联网平台。 - 需通过证书"certificates"发放的设备：WaterMeter-Beijing0001、WaterMeter-Beijing0002  - 证书名称：certificates  - 发放区域：华北-北京四  - 发放应用：beijing-app1   |
      
   
   
 
#### 创建注册组
MQTT证书接入的设备，可以在设备发放创建一个注册组，绑定对应的CA证书和自定义策略，可以实现批量设备的自注册，实现设备一键上电即可上云的动作，可在注册组详情中查看该注册组下所有的设备。
1. 进入"设备-注册组"界面，单击右上角"新增注册组"。 
   图10新增注册组   
   ![](https://support.huaweicloud.com/bestpractice-iotps/figure/zh-cn_image_0000001789544630.png "点击放大")
   
   
2. 按照下方参数说明填写关键参数信息后，完成创建。 
   表5参数信息 
   | 参数名称  | 说明                                     |
   |:---|:---|
   | 注册组名称 | 注册组的唯一标识。                              |
   | 选择证书  | 用于和注册组绑定，同一个证书只能同时绑定一个注册组，不能同时绑定多个注册组。 |
   | 发放策略  | 当前只支持"自定义策略"，同时需要选择所要运行的函数。            |
      
   
   
 
#### 生成设备证书
1. 使用OpenSSL工具为设备证书生成密钥对（设备私钥）： 
   ```
   openssl genrsa -out deviceCert.key 2048
   ```
   
   
2. 使用设备密钥对，生成证书签名请求文件： 
   ```
   openssl req -new -key deviceCert.key -out deviceCert.csr
   ```
   ![](https://support.huaweicloud.com/bestpractice-iotps/public_sys-resources/note_3.0-zh-cn.png)
   生成证书签名请求文件时，要求填写证书唯一标识名称（Distinguished Name，DN）信息，参数说明如下[表2]所示。
    表6参数说明 
   | **提示**                                            | **参数名称**            | **取值样例**                      |
   |:---|:---|:---|
   | Country Name (2 letter code) \[\]:                | 国家/地区               | CN                            |
   | State or Province Name (full name) \[\]:          | 省/市                 | GuangDong                     |
   | Locality Name (eg, city) \[\]:                    | 城市                  | ShenZhen                      |
   | Organization Name (eg, company) \[\]:             | 组织机构（或公司名）          | Huawei Technologies Co., Ltd. |
   | Organizational Unit Name (eg, section) \[\]:      | 机构部门                | Cloud Dept.                   |
   | Common Name (eg, fully qualified host name) \[\]: | CA名称（CN）            | Huawei IoTDP CA               |
   | Email Address \[\]:                               | 邮箱地址                | /                             |
   | A challenge password \[\]:                        | 证书密码，如您不设置密码，可以直接回车 | /                             |
   | An optional company name \[\]:                    | 可选公司名称，如您不设置，可以直接回车 | /                             |
      
   
   
3. 使用CA证书、CA证书私钥和CSR文件创建设备证书（deviceCert.crt）。 
   ```
   openssl x509 -req -in deviceCert.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out deviceCert.crt -days 36500 -sha256
   ```
   ![](https://support.huaweicloud.com/bestpractice-iotps/public_sys-resources/note_3.0-zh-cn.png)
   生成设备证书用到的"rootCA.crt"和"rootCA.key"这两个文件，为"制作CA证书"中所生成的两个文件，且需要完成"上传并验证CA证书"。
   "-days"后的参数值指定了该证书的有效天数，此处示例为36500天，您可根据实际业务场景和需要进行调整。
   
   
 
#### 设备免注册接入
1. 下载并修改华为SDK示例代码进行设备引导（这里以[java sdk代码](https://github.com/huaweicloud/huaweicloud-iot-device-sdk-java)为示例）。
   
   ![](https://support.huaweicloud.com/bestpractice-iotps/public_sys-resources/note_3.0-zh-cn.png)
   使用IDEA/Eclipse打开SDK代码工程，修改iot-device-demo目录下的DEMO示例"BootstrapSelfRegSample"中的参数。
   1. ScopeId从设备发放的注册组页面中获取；
   
   2. deviceId由客户自主规划且未在平台注册（需注意平台要求deviceId全局唯一）；
   
   3. 设备证书指定为"控制台开发"中生成的设备证书；
   
   4. bootstrapUri为上述[终端节点](https://support.huaweicloud.com/endpoint-iotps/iot_04_0001.html)。
    
   图11修改demo示例   
   ![](https://support.huaweicloud.com/bestpractice-iotps/figure/zh-cn_image_0000001324832262.png "点击放大")
   
   
2. 运行DEMO程序，看到如下日志，代表设备发放成功，并且已经收到设备发放下发的设备接入地址。如果程序运行正常，在对应的设备接入实例可以看到该设备，且该设备已在线。 
   图12日志信息   
   ![](https://support.huaweicloud.com/bestpractice-iotps/figure/zh-cn_image_0000001375752925.png "点击放大")
   
   
3. 收到设备发放下发的设备接入地址后，需要关闭设备侧的设备发放的连接，用的新的URL地址与设备接入通信，进行相关业务。 
   图13关闭连接示例代码   
   ![](https://support.huaweicloud.com/bestpractice-iotps/figure/zh-cn_image_0000001324672342.png "点击放大")
   ![](https://support.huaweicloud.com/bestpractice-iotps/public_sys-resources/note_3.0-zh-cn.png)
   说明：
   1. DeviceId即设备ID，用于唯一标识一个设备。设备需使用未注册的DeviceId进行免注册接入，不同设备的DeviceId不同。
   
   2. 在客户实际业务场景中，推荐一个设备使用一个设备证书，不建议多个设备共用一个设备证书。
    
   
   
 
