在 AWS 使用 openssl 產生 CA 憑證,並與 IoT Core 交互(二)
目錄
1. 前情提要
2. 簽署裝置憑證
2-1 註冊裝置憑證
2-2 開始連接 AWS
⦿ 前情提要
⦿ 簽署裝置憑證
⦿ 註冊裝置憑證
⦿ 開始連接 AWS
前情提要
在前一篇文章中,我們使用 OpenSSL 建立自簽 rootCA 憑證,由於自簽憑證僅適用於內部使用,換句話說只能自 High,也就是說該 rootCA 簽署的憑證僅適用於內部驗證,所以要與 AWS 交互,需要經過 AWS 認證,讓 AWS 認證需要準備認證用的 private key,由此 private key 產生的 CSR,將自簽 rootCA 的 private key 與自簽 rootCA 憑證跟 CSR 組合而成 CRT。
接著,告訴 AWS 說我們要認證這個自簽 rootCA 憑證,使用 CRT 來認證,成功後,就可以開始用 rootCA 簽署裝置憑證,並讓裝置憑證與 AWS IoT Core 交互。
但必須記得將 CA 憑證狀態設定為作用中,以及將 CA 憑證的自動註冊打開,自動註冊的意思為,若 CA 憑證簽署的裝置憑證,在第一次連上 AWS 時,便能夠自動註冊。
現在,我們可以用經過 AWS 認證的 rootCA 憑證來簽署裝置憑證了。
繼續閱讀|回目錄
簽署裝置憑證
同樣地,打開你的 Terminal,鍵入如下:
$ openssl genrsa -out deviceCertOne.key 2048
$ openssl req -new -key deviceCertOne.key -out deviceCertOne.csr
$ openssl x509 -req -in deviceCertOne.csr -CA sampleCACertificate.pem -CAkey sampleCACertificate.key -CAcreateserial -out deviceCertOne.crt -days 365 -sha256
同樣建立 Device 的 private key,以及由 private key 形成的 CSR,接著,由於我們經 AWS 認證過的 CA 憑證叫做 sampleCACertificate.pem
以及它的 private key 叫做 sampleCACertificate.key
,將 deviceCertOne 的 CSR 組合成 CRT。
註冊裝置憑證
接著,我們到 IoT Core 主控台,左邊安全性頁籤選擇憑證
,在右邊下拉選單點選註冊憑證
,如下:
不過這邊先跳開一下,如果你已經建立多個 CA 憑證,在左邊頁籤為憑證驗證機構時,會看到如下:
雖然 CA 憑證有不同的 ID,但我們取名時跟 AWS 產生的 ID 並沒有關聯起來,那可以藉由幾種方法來確認哪個憑證是哪個 ID。
- 檢查產生日期:
在 CLI 輸入aws iot describe-ca-certificate — certificate-id
<certificateId>,我們去查 “creationDate”: “2024–02–17T16:31
:03.153000+08:00”。
接著,輸入ls -l
,查看 rootCA.pem 的產生日期,得到 -rw-r — r — 1 chunlicheng staff 1107 Feb 1716:22
rootCA.pem。
比對 rootCA.pem 的產生日期與某憑證 ID 通過 AWS 驗證的日期,這邊看到 16:22 => 16:31,總共經過九分鐘,看起來挺合理的,因為產生 rootCA 的時間一定比經過 AWS 認證它還要早。 - 查看 pem 的 base64:
同樣地,在 CLI 輸入aws iot describe-ca-certificate — certificate-id
<certificateId>,我們去查“certificatePem”: “ — — -BEGIN CERTIFICATE — — -\n — — -END CERTIFICATE — — -\n”
這一欄。
接著,輸入 cat rootCA.pem 同樣得到— — -BEGIN CERTIFICATE — — -
與— — -END CERTIFICATE — — -
。
比對其中的 base64,來確定是否 AWS 上的某個 certificate ID 就是某個 rootCA.pem。
確認裝置憑證是由 AWS 認證過的 CA 憑證簽署,否則會出現如下情況:
The certificate is not valid.
而當你簽署的憑證是正確的,就會直接跳到裝置憑證頁面,如下:
不過這時憑證非 ACTIVE
,並且還缺少權限(IoT Core Policy,IoT Core 政策),所以裝置直接使用該憑證是無效的,我們將憑證啟用,如下:
連接應當連接的政策,如下:
開始連接 AWS
如果都準備完善了,參考之前的文章:
當 ESP32 使用 PubSubClient(Arduino 套件) 去與 AWS 做安全的 MQTT 連接(port 為 8883)時,需要準備的有幾樣東西:
- 你的 Endpoint,忘記 Endpoint 的朋友可以到 IoT Core 左邊頁籤的
設定
去找回來。 - Device Certificate(X.509):給 AWS 認證過的 CRT。
- Device private key:用來簽 2. 使用的 private key。
- rootCA Certificate(X.509),不是你的 CA 憑證,是 AWS 提供下載的 rootCA 憑證,而 rootCA 的 base64 的內容到這個網址中就可看到。
在 2. 3. 4. 中,你要貼到 Arduino 中的是這個檔案的 base64,我們在 CLI 可分別用 cat
指令去看到 X.509 與 private key 的文字
。
然後在 Arduino 中,看到 ESP32 確實連上。
接著,就可以在 IoT Core 的 MQTT 主控台收到來自 ESP32 發出的訊息:
完成了!與之前文章的差異在,你可以用自己的 CA 憑證
來簽署裝置憑證
,而之前的方法是裝置憑證
、簽裝置憑證使用的 private key
皆由 AWS 產生,這增加一些產出流程上的限制,第一個是產出憑證時需要有網路環境,無論是用 shell script 或是直接在 AWS 以網頁操作,都需要在有網路的情況下才能操作。
第二個是沒辦法很靈活地管控
這些裝置憑證,因為 AWS 只負責產出,操作時你只負責下載,所以,若有經過 AWS 認證的多個 CA 憑證,由該 CA 憑證簽署出來的裝置憑證,我們可以有不同期的裝置憑證的管控,比方說 2024 上半年的裝置由上半年經 AWS 認證的 CA 憑證來簽署,下半年的裝置由下半年經 AWS 認證的 CA 憑證來簽署,對於追蹤憑證,管理產線流程是相當有幫助的。
完成了!這次就分享到這,感謝您的閱讀。
繼續閱讀|回目錄
Reference: