
为了保证通信的安全性,IoT 设备与 AWS IoT Core 的 MQTT 通信使用基于证书的 TLS 1.2 双向认证体系。
利用即时注册(JITR)功能,可以快速的进行设备证书注册及设备上线。但是配置相关 Lambda 函数的方式相对复杂。你可以通过即时部署(JITP)功能,可以简化 IoT 规则和 Lambda 函数的步骤,直接在注册设备 CA 证书的同时附加上一个自定义好的模版。在设备第一次连接 AWS IoT 平台的时候,JITP 会参照该模版的定义来完成设备证书的注册和设备在云端的创建过程。
JITP实现步骤
从上图 JITR 和 JITP 两种方式的对比中可以看出, JITP 简化了部分流程。
完整 JITP 认证步骤如下:
- 创建 CA 证书,模板和相应 IAM 权限
- 在 AWS IoT Core 上注册和激活 CA 证书并附加模板。
- 使用该 CA 证书签发设备证书并安装在 IoT 设备上。
- IoT 设备与 AWS IoT Core 的第一次连接,触发即时部署。
创建私有CA证书、模板和IAM权限
在真实场景中,用户的设备证书经常是由中间 CA 证书 (Intermediate CA Certificate) 签发而来,而不是由根 CA 签发 (Root CA Certificates)。为了方便起见,我们用 OpenSSL 生成根证书,并直接签发设备证书。
$ openssl genrsa -out CA_Private.key 2048
$ openssl req -x509 -new -nodes -key CA_Private.key -sha256 -days 365 -out CA_Certificate.pem
由于 JITP 是通过模版定义来注册设备证书和创建设备,因此模版中相应的权限必不可少。下面我们在 IAM 中来创建一个角色并赋予相应的权限。
登陆到 AWS Console 并进入 IAM 页面,创建角色。
选择“AWS 产品”中的 IoT,点击”下一步:权限”
填写角色名称“JITP”后,点击创建角色
角色创建完成后,点击角色名称 JITP 并记录下角色
ARN(arn:aws:iam::12xxxx9:role/JITP)
在准备好角色和权限后我们开始创建模版,这个模版会在之后注册 CA 证书的时候一起提交给 AWS IoT Core。
这里的模版实际上就是一个 JSON 文档,里面包含两部分。一部分是参数(Parameters),另一部分是资源(Resource)。
Parameters 部分你可以定义如下内容:
在下面的模版中我们定义了两个 Parameters,一个是 AWS::IoT::Certificate::Country,另一个是 AWS::IoT::Certificate::Id。这样在设备首次连接 IoT 平台时,设备证书中对应的这两个字段会被抽取出来用于 Resources 中 Thing 的创建。第二行的 roleARN 是前面创建的角色 JITP 的 ARN(Amazon Resource Names),如果按照步骤做的话应该已经记录下来了。
我们将这段 JSON 代码保存到一个文件中,文件名为 provisioning-template.json。
这个模版实际上规定了在设备连接时, AWS IoT Core 会创建两样东西,一个是 Thing(设备在云上的映射),另外一个是 Policy(操作权限),您可以从模版中 Resources 中看到,并且接下来 JITP 还会自动做三件事:
- 将 Policy 赋予证书
- 将证书挂载到 Thing 上面
- 更新证书状态为 Active
在 AWS IoT 平台上注册和激活 CA 证书并附加模版
为了安全,AWS IoT Core 提供了相应的审核流程确保你同时持有 CA 证书和对应的私钥。因此,在最终注册 CA 证书之前,我们还需要按照流程生成一份用于验证 CA 证书和私钥持有者身份的中间证书(请注意这份证书并不是上面创建的 CA 证书)。
随机生成的认证码可以通过API获取:
$aws iot get-registration-code
使用 OpenSSL 生成用于验证身份的私钥和证书请求文件(CSR – Certificate Signing Request)
$ openssl genrsa -out Verification_Private.key 2048
$ openssl req -new -key Verification_Private.key -out Verification.csr
在创建 CSR 的过程中,你会被提示输入如下一些内容,将前一步记录下的认证码填入到 Common Name 中:
Organization Name (eg, company) []:
Organizational Unit Name (eg, p)
Common Name (e.g. server FQDN or YOUR name) []: XXXXXREGISTRATIONCODEXXXXX
接下来,使用 CA 证书和私钥,以及上面创建的 CSR 来生成一份用于验证身份的中间证书:
$ openssl x509 -req -in Verification.csr -CA CA_Certificate.pem -CAkey CA_Private.key -CAcreateserial -out Verification.crt -days 365 -sha256
最后,通过如下命令导入 CA 证书和中间证书完成 CA 证书的注册和激活。同时,通过设置–allow-auto-registration 的方式,开启设备连接至 IoT Core 时设备证书的自动注册,并通过–registration-config 绑定模版到 CA 证书上。这个命令的输出会返回对应 CA 证书在 AWS IoT Core 上的证书 arn (certificateArn)和证书 ID (caCertificateId).
$ aws iot register-ca-certificate --ca-certificate file://CA_Certificate.pem --verification-certificate file://Verification.crt --set-as-active --allow-auto-registration --registration-config file://provisioning-template.json
这时如果你进入 IoT Core 服务,点击左侧的安全—>CA,会看到我们的 CA 已经注册到了 AWS IoT 平台上了。
使用私有CA签发设备证书
当我们创建并注册好 CA 证书之后,就可以开始用这个 CA 证书来签发设备证书了,步骤如下。
创建一个设备证书的私钥 Device.key 和对应的证书请求文件 Device_Certificate.csr:
$ openssl genrsa -out Device.key 2048
$ openssl req -new -key Device.key -out Device_Certificate.csr
使用 CA 证书,CA 证书私钥和证书请求文件签发设备证书 Device_Certificate.crt:
$ openssl x509 -req -in Device_Certificate.csr -CA CA_Certificate.pem -CAkey CA_Private.key -CAcreateserial -out Device_Certificate.crt -days 365 -sha256
设备第一次连接
成功连接并发布消息后会有如下的输出:
Client xxx sending CONNECT
Client xxx received CONNACK
Client xxx sending PUBLISH ('JITP/test')
Client xxx received PUBACK
Client xxx sending DISCONNECT
这时我们进入 AWS IoT 界面,点击左侧的安全后,在证书页面中可以看到我们的设备证书已经注册并激活了。
往期推荐
1、AWS IoT物联网设备认证-即时注册JITR