
為了保證通信的安全性,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