教學課程: 使用註冊群組佈建多部 X.509 裝置
在本教學課程中,您將了解如何佈建使用 X.509 憑證進行驗證的 IoT 裝置群組。 Azure IoT SDK 中的範例裝置程式碼將會在您的開發電腦上執行,以模擬 X.509 裝置的佈建。 在實際裝置上,裝置程式碼會從 IoT 裝置部署和執行。
Azure IoT 中樞裝置佈建服務支援兩種註冊類型以佈建裝置:
- 註冊群組:用來註冊多個相關的裝置。 本教學課程示範如何使用註冊群組進行布建。
- 個別註冊:用來註冊單一裝置。
Azure IoT 中樞裝置佈建服務支援三種驗證形式以佈建裝置:
- X.509 憑證 - 本教學課程示範 X.509 憑證證明
- 信賴平台模組 (TPM)
- 對稱金鑰
在生產案例中, 硬體安全性模組 (HSM) 用於裝置秘密的安全硬體型記憶體。 HSM 可以搭配對稱金鑰、x.509 憑證或 TPM 證明使用,以提供祕密的安全儲存體。 建議以硬體為基礎的裝置密碼記憶體,以協助保護敏感性資訊,例如裝置憑證的私鑰。
在本教學課程中,您將完成下列目標:
- 建立信任鏈,以使用 x.509 憑證來組織一組裝置。
- 建立使用憑證鏈結的新群組註冊。
- 設定開發環境。
- 使用 Azure IoT 裝置 SDK 中的範例程式代碼,使用憑證鏈結布建裝置。
必要條件
如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶。
用來模擬裝置的 Windows 開發環境具有下列必要條件。 針對 Linux 或 macOS,請參閱 SDK 文件中準備您的開發環境中的適當章節。
安裝 Visual Studio 2022 並啟用 [使用 C++ 的桌面開發] 工作負載。 也會支援 Visual Studio 2015、Visual Studio 2017 和 Visual Studio 19。
下載最新版的 CMake 建置系統。 確定核取將 CMake 可執行檔新增至路徑的選項。
重要
在開始
CMake
安裝之前,請先確認已安裝Visual Studio必要條件(Visual Studio和「使用 C++ 進行桌面開發」工作負載。 在符合先決條件,並且驗證過下載項目之後,請安裝 CMake 建置系統。 此外請注意,舊版的 CMake 建置系統無法產生本教學課程中所使用的方案檔。 請務必使用最新版的 CMake。
下列必要條件適用於 Windows 開發環境。 針對 Linux 或 macOS,請參閱 SDK 文件中準備您的開發環境中的適當章節。
在您的 Windows 型機器上安裝 .NET SDK 6.0 或更新版本。 您可以使用下列命令來檢查您的版本。
dotnet --info
下列必要條件適用於 Windows 開發環境。 針對 Linux 或 macOS,請參閱 SDK 文件中準備您的開發環境中的適當章節。
- 在您的電腦上安裝 Node.js v4.0 或更新版本。
下列必要條件適用於 Windows 開發環境。
- 在您的電腦上安裝 Python 3.6 或更新版本。
下列必要條件適用於 Windows 開發環境。 針對 Linux 或 macOS,請參閱 SDK 文件中準備您的開發環境中的適當章節。
在您的電腦上安裝 Java SE 開發套件 8 或更新版本。
下載並安裝 Maven。
安裝最新版的 Git。 確定 Git 已新增至可存取命令視窗的環境變數中。
請確定 您的電腦已安裝 OpenSSL 。 在 Windows 上安裝 Git 會同時安裝 OpenSSL。 您可以從 Git Bash 命令提示字元存取 OpenSSL。 若要確認已安裝 OpenSSL,請開啟 Git Bash 命令提示字元,然後輸入
openssl version
。注意
除非您熟悉 OpenSSL 並已在 Windows 電腦上進行安裝,否則建議您從 Git Bash 命令提示字元使用 OpenSSL。 或者,您可以選擇下載原始程式碼並建置 OpenSSL。 如果您選擇建置或下載 OpenSSL,請確定您的路徑可存取 OpenSSL 二進位檔,並將
OPENSSL_CNF
環境變數設定為 openssl.cnf 檔案的路徑。
準備您的開發環境
在本節中,您會準備用來建置 Azure IoT C SDK 的開發環境。 此 SDK 包括使用 DPS 佈建裝置所使用的範例程式碼和工具。
在網頁瀏覽器中,移至 Azure IoT C SDK 的 [發行] 頁面。
複製最新版 Azure IoT C SDK 的標籤名稱,例如:
lts_03_2024
。開啟 Windows 命令提示字元並執行下列命令,以複製最新版的 Azure IoT 裝置 SDK for C GitHub 存放庫。 將取代
<release-tag>
為您在上一個步驟中複製的標記。git clone -b <release-tag> https://github.com/Azure/azure-iot-sdk-c.git cd azure-iot-sdk-c git submodule update --init
此作業可能需要幾分鐘的時間才能完成。
作業完成時,請從
azure-iot-sdk-c
目錄執行下列命令:mkdir cmake cd cmake
程式碼範例會使用 X.509 憑證來提供透過 X.509 驗證的證明。 執行下列命令以建置開發平台專屬的 SDK 版本,其包含裝置佈建用戶端。
cmake
目錄中會產生模擬裝置的 Visual Studio 解決方案。將取代
<path
為您複製之 C SDK 的絕對路徑。cmake -Duse_prov_client:BOOL=ON -Dhsm_custom_lib=c:/<path>/azure-iot-sdk-c/cmake/provisioning_client/samples/custom_hsm_example/Debug/custom_hsm_example.lib ..
提示
如果
cmake
找不到 C++ 編譯器,您在執行上述命令時,可能會收到建置錯誤。 如果發生這種情況,請嘗試在 Visual Studio 命令提示字元中執行命令。建置成功時,最後幾行輸出會類似於下列輸出:
cmake -Duse_prov_client:BOOL=ON -Dhsm_custom_lib=c:/azure-iot-sdk-c/cmake/provisioning_client/samples/custom_hsm_example/Debug/custom_hsm_example.lib .. -- Building for: Visual Studio 17 2022 -- Selecting Windows SDK version 10.0.19041.0 to target Windows 10.0.22000. -- The C compiler identification is MSVC 19.32.31329.0 -- The CXX compiler identification is MSVC 19.32.31329.0 ... -- Configuring done -- Generating done -- Build files have been written to: C:/azure-iot-sdk-c/cmake
開啟 Windows 命令提示字元,並使用下列命令複製 適用於 C# 的 Azure IoT SDK GitHub 存放庫:
git clone https://github.com/Azure/azure-iot-sdk-csharp.git
開啟 Windows 命令提示字元,並使用下列命令複製 適用於 Node.js GitHub 存放庫的 Azure IoT SDK:
git clone https://github.com/Azure/azure-iot-sdk-node.git
開啟 Windows 命令提示字元,並使用下列命令複製 適用於 Python GitHub 的 Azure IoT 裝置 SDK 存放庫:
git clone -b v2 https://github.com/Azure/azure-iot-sdk-python.git --recursive
注意
本教學課程中所使用的範例位於 azure-iot-sdk-python 存放庫的 v2 分支中。 Python SDK V3 有搶鮮版 (Beta) 可供使用。
開啟 Windows 命令提示字元,並使用下列命令複製適用於 Java GitHub 的 Azure IoT 範例存放庫:
git clone https://github.com/Azure/azure-iot-sdk-java.git --recursive
前往
azure-iot-sdk-java
根目錄並建置專案,以下載所有必要套件。cd azure-iot-sdk-java mvn install -DskipTests=true
建立 X.509 憑證鏈結
在本節中,您會產生三個憑證的 X.509 憑證鏈結,以測試本教學課程的每部裝置。 這些憑證具有下列階層。
跟證書 您上傳並使用 DPS 驗證跟證書。 這項驗證會讓 DPS 信任該憑證,並驗證其所簽署的憑證。
中繼憑證: 通常會使用中繼憑證根據產品線、公司部門或其他準則,以邏輯方式將裝置分組。 本教學課程使用具有一個中繼憑證的憑證鏈結,但在實際執行情況中,您可能會有數個中繼憑證。 此鏈結中的中繼憑證會由根憑證簽署。 此憑證會提供給 DPS 中建立的註冊群組。 此組態可讓您管理具有相同中繼憑證所簽署之裝置憑證的整個裝置群組。
裝置憑證:裝置憑證(有時稱為分葉憑證)是由中繼憑證簽署,並連同其私鑰一起儲存在裝置上。 在理想情況下,這些敏感性項目會使用 HSM 安全地儲存。 同一個中繼憑證可以簽署多個裝置憑證。 當您嘗試佈建時,每部裝置都會顯示其憑證和私密金鑰,以及憑證鏈結。
如需憑證鏈結的詳細資訊,請參閱 X.509 憑證證明。
設定 X.509 OpenSSL 環境
在本節中,您會建立 OpenSSL 組態檔、目錄結構,以及 OpenSSL 命令所使用的其他檔案。
開啟 Git Bash 命令提示字元,並流覽至您要產生本教學課程 X.509 憑證和密鑰的資料夾。
為您的根 CA 憑證建立名為 openssl_root_ca.cnf 的 OpenSSL 組態檔。 OpenSSL 組態檔包含 OpenSSL 命令所使用的原則和定義。 將下列文字複製並貼到 openssl_root_ca.cnf 檔案中:
# OpenSSL root CA configuration file. [ ca ] default_ca = CA_default [ CA_default ] # Directory and file locations. dir = . certs = $dir/certs crl_dir = $dir/crl new_certs_dir = $dir/newcerts database = $dir/index.txt serial = $dir/serial RANDFILE = $dir/private/.rand # The root key and root certificate. private_key = $dir/private/azure-iot-test-only.root.ca.key.pem certificate = $dir/certs/azure-iot-test-only.root.ca.cert.pem # For certificate revocation lists. crlnumber = $dir/crlnumber crl = $dir/crl/azure-iot-test-only.intermediate.crl.pem crl_extensions = crl_ext default_crl_days = 30 # SHA-1 is deprecated, so use SHA-2 instead. default_md = sha256 name_opt = ca_default cert_opt = ca_default default_days = 375 preserve = no policy = policy_loose [ policy_strict ] # The root CA should only sign intermediate certificates that match. countryName = optional stateOrProvinceName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional [ policy_loose ] # Allow the intermediate CA to sign a more diverse range of certificates. countryName = optional stateOrProvinceName = optional localityName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional [ req ] default_bits = 2048 distinguished_name = req_distinguished_name string_mask = utf8only # SHA-1 is deprecated, so use SHA-2 instead. default_md = sha256 # Extension to add when the -x509 option is used. x509_extensions = v3_ca [ req_distinguished_name ] # See <https://en.wikipedia.org/wiki/Certificate_signing_request>. countryName = Country Name (2 letter code) stateOrProvinceName = State or Province Name localityName = Locality Name 0.organizationName = Organization Name organizationalUnitName = Organizational Unit Name commonName = Common Name emailAddress = Email Address # Optionally, specify some defaults. countryName_default = US stateOrProvinceName_default = WA localityName_default = 0.organizationName_default = My Organization organizationalUnitName_default = emailAddress_default = [ v3_ca ] # Extensions for a typical CA. subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = critical, CA:true keyUsage = critical, digitalSignature, cRLSign, keyCertSign [ v3_intermediate_ca ] # Extensions for a typical intermediate CA. subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = critical, CA:true keyUsage = critical, digitalSignature, cRLSign, keyCertSign [ usr_cert ] # Extensions for client certificates. basicConstraints = CA:FALSE nsComment = "OpenSSL Generated Client Certificate" subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment extendedKeyUsage = clientAuth [ server_cert ] # Extensions for server certificates. basicConstraints = CA:FALSE nsComment = "OpenSSL Generated Server Certificate" subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer:always keyUsage = critical, digitalSignature, keyEncipherment extendedKeyUsage = serverAuth [ crl_ext ] # Extension for CRLs. authorityKeyIdentifier=keyid:always [ ocsp ] # Extension for OCSP signing certificates. basicConstraints = CA:FALSE subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer keyUsage = critical, digitalSignature extendedKeyUsage = critical, OCSPSigning
建立名為 openssl_device_intermediate_ca.cnf 的 OpenSSL 組態檔,以用於中繼和裝置憑證。 將下列文字複製並貼到 openssl_device_intermediate_ca.cnf 檔案中:
# OpenSSL root CA configuration file. [ ca ] default_ca = CA_default [ CA_default ] # Directory and file locations. dir = . certs = $dir/certs crl_dir = $dir/crl new_certs_dir = $dir/newcerts database = $dir/index.txt serial = $dir/serial RANDFILE = $dir/private/.rand # The root key and root certificate. private_key = $dir/private/azure-iot-test-only.intermediate.key.pem certificate = $dir/certs/azure-iot-test-only.intermediate.cert.pem # For certificate revocation lists. crlnumber = $dir/crlnumber crl = $dir/crl/azure-iot-test-only.intermediate.crl.pem crl_extensions = crl_ext default_crl_days = 30 # SHA-1 is deprecated, so use SHA-2 instead. default_md = sha256 name_opt = ca_default cert_opt = ca_default default_days = 375 preserve = no policy = policy_loose [ policy_strict ] # The root CA should only sign intermediate certificates that match. countryName = optional stateOrProvinceName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional [ policy_loose ] # Allow the intermediate CA to sign a more diverse range of certificates. countryName = optional stateOrProvinceName = optional localityName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional [ req ] default_bits = 2048 distinguished_name = req_distinguished_name string_mask = utf8only # SHA-1 is deprecated, so use SHA-2 instead. default_md = sha256 # Extension to add when the -x509 option is used. x509_extensions = v3_ca [ req_distinguished_name ] # See <https://en.wikipedia.org/wiki/Certificate_signing_request>. countryName = Country Name (2 letter code) stateOrProvinceName = State or Province Name localityName = Locality Name 0.organizationName = Organization Name organizationalUnitName = Organizational Unit Name commonName = Common Name emailAddress = Email Address # Optionally, specify some defaults. countryName_default = US stateOrProvinceName_default = WA localityName_default = 0.organizationName_default = My Organization organizationalUnitName_default = emailAddress_default = [ v3_ca ] # Extensions for a typical CA. subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = critical, CA:true keyUsage = critical, digitalSignature, cRLSign, keyCertSign [ v3_intermediate_ca ] # Extensions for a typical intermediate CA. subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = critical, CA:true keyUsage = critical, digitalSignature, cRLSign, keyCertSign [ usr_cert ] # Extensions for client certificates. basicConstraints = CA:FALSE nsComment = "OpenSSL Generated Client Certificate" subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment extendedKeyUsage = clientAuth [ server_cert ] # Extensions for server certificates. basicConstraints = CA:FALSE nsComment = "OpenSSL Generated Server Certificate" subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer:always keyUsage = critical, digitalSignature, keyEncipherment extendedKeyUsage = serverAuth [ crl_ext ] # Extension for CRLs. authorityKeyIdentifier=keyid:always [ ocsp ] # Extension for OCSP signing certificates. basicConstraints = CA:FALSE subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer keyUsage = critical, digitalSignature extendedKeyUsage = critical, OCSPSigning
建立目錄結構、資料庫檔案 index.txt,以及 OpenSSL 命令在本教學課程中使用的序號檔案 序列 :
mkdir certs csr newcerts private touch index.txt openssl rand -hex 16 > serial
建立根 CA 憑證
執行下列命令來建立根 CA 私鑰和根 CA 憑證。 您可以使用此憑證和金鑰來簽署中繼憑證。
在您的 Git Bash 終端機中,建立根 CA 私鑰:
openssl genrsa -aes256 -passout pass:1234 -out ./private/azure-iot-test-only.root.ca.key.pem 4096
建立根 CA 憑證:
openssl req -new -x509 -config ./openssl_root_ca.cnf -passin pass:1234 -key ./private/azure-iot-test-only.root.ca.key.pem -subj '//CN=Azure IoT Hub CA Cert Test Only' -days 30 -sha256 -extensions v3_ca -out ./certs/azure-iot-test-only.root.ca.cert.pem
重要
只需要針對主體名稱提供的額外正斜線 (
//CN=Azure IoT Hub CA Cert Test Only
) 以在 Windows 平台上使用 Git 逸出字串。 在 Linux 平臺上,僅提供一個正斜線 (/CN=Azure IoT Hub CA Cert Test Only
) 的主體名稱。檢查根 CA 憑證:
openssl x509 -noout -text -in ./certs/azure-iot-test-only.root.ca.cert.pem
Issuer 和 Subject 都應為根 CA。
Certificate: Data: Version: 3 (0x2) Serial Number: 1d:93:13:0e:54:07:95:1d:8c:57:4f:12:14:b9:5e:5f:15:c3:a9:d4 Signature Algorithm: sha256WithRSAEncryption Issuer: CN = Azure IoT Hub CA Cert Test Only Validity Not Before: Jun 20 22:52:23 2022 GMT Not After : Jul 20 22:52:23 2022 GMT Subject: CN = Azure IoT Hub CA Cert Test Only Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public-Key: (4096 bit)
建立中繼 CA 憑證
執行下列命令來建立中繼 CA 私鑰和中繼 CA 憑證。 您可以使用此憑證和金鑰來簽署您的裝置憑證。
在您的 Git Bash 終端機中,建立中繼 CA 私鑰:
openssl genrsa -aes256 -passout pass:1234 -out ./private/azure-iot-test-only.intermediate.key.pem 4096
建立中繼 CA 憑證簽署要求 (CSR):
openssl req -new -sha256 -passin pass:1234 -config ./openssl_device_intermediate_ca.cnf -subj '//CN=Azure IoT Hub Intermediate Cert Test Only' -key ./private/azure-iot-test-only.intermediate.key.pem -out ./csr/azure-iot-test-only.intermediate.csr.pem
重要
只需要針對主體名稱提供的額外正斜線 (
//CN=Azure IoT Hub Intermediate Cert Test Only
) 以在 Windows 平台上使用 Git 逸出字串。 在 Linux 平臺上,以單一正斜線 (/CN=Azure IoT Hub Intermediate Cert Test Only
) 提供主體名稱。使用根 CA 憑證簽署中繼憑證
openssl ca -batch -config ./openssl_root_ca.cnf -passin pass:1234 -extensions v3_intermediate_ca -days 30 -notext -md sha256 -in ./csr/azure-iot-test-only.intermediate.csr.pem -out ./certs/azure-iot-test-only.intermediate.cert.pem
檢查中繼 CA 憑證:
openssl x509 -noout -text -in ./certs/azure-iot-test-only.intermediate.cert.pem
Issuer 應為根 CA,而 Subject 應為中繼 CA。
Certificate: Data: Version: 3 (0x2) Serial Number: d9:55:87:57:41:c8:4c:47:6c:ee:ba:83:5d:ae:db:39 Signature Algorithm: sha256WithRSAEncryption Issuer: CN = Azure IoT Hub CA Cert Test Only Validity Not Before: Jun 20 22:54:01 2022 GMT Not After : Jul 20 22:54:01 2022 GMT Subject: CN = Azure IoT Hub Intermediate Cert Test Only Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public-Key: (4096 bit)
建立裝置憑證
在本節中,您會建立兩個裝置憑證及其完整鏈結憑證。 完整鏈結憑證包含裝置憑證、中繼 CA 憑證和根 CA 憑證。 當裝置向 DPS 註冊時,必須顯示其完整鏈結憑證。
建立第一個裝置私密金鑰。
openssl genrsa -out ./private/device-01.key.pem 4096
建立裝置憑證 CSR。
裝置憑證的主體通用名稱 (CN) 必須設定為您的裝置用來向 DPS 註冊的註冊識別碼。 註冊識別碼是一組不區分大小寫的字串,由英數字元和
'-'
、'.'
、'_'
、':'
等特殊字元組成。 最後一個字元必須是英數字元或虛線 ('-'
)。 通用名稱必須遵循此格式。 DPS 支援最多 128 個字元的註冊識別碼;不過,X.509 憑證中主體通用名稱的最大長度為 64 個字元。 因此,使用 X.509 憑證時,註冊識別碼限制為 64 個字元。 若是群組註冊,註冊識別碼也會作為 IoT 中樞的裝置識別碼。主體通用名稱是使用
-subj
參數來設定。 在下列命令中,通用名稱設定為 device-01。openssl req -config ./openssl_device_intermediate_ca.cnf -key ./private/device-01.key.pem -subj '//CN=device-01' -new -sha256 -out ./csr/device-01.csr.pem
重要
只需要針對主體名稱提供的額外正斜線 (
//CN=device-01
) 以在 Windows 平台上使用 Git 逸出字串。 在 Linux 平臺上,以單一正斜線 (/CN=device-01
) 提供主體名稱。簽署裝置憑證。
openssl ca -batch -config ./openssl_device_intermediate_ca.cnf -passin pass:1234 -extensions usr_cert -days 30 -notext -md sha256 -in ./csr/device-01.csr.pem -out ./certs/device-01.cert.pem
檢查裝置憑證:
openssl x509 -noout -text -in ./certs/device-01.cert.pem
Issuer 應為中繼 CA,而 Subject 應為裝置註冊識別碼
device-01
。Certificate: Data: Version: 3 (0x2) Serial Number: d9:55:87:57:41:c8:4c:47:6c:ee:ba:83:5d:ae:db:3a Signature Algorithm: sha256WithRSAEncryption Issuer: CN = Azure IoT Hub Intermediate Cert Test Only Validity Not Before: Jun 20 22:55:39 2022 GMT Not After : Jul 20 22:55:39 2022 GMT Subject: CN = device-01 Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public-Key: (4096 bit)
當裝置向 DPS 進行驗證時,必須顯示完整憑證鏈結。 使用下列命令來建立憑證鏈結:
cat ./certs/device-01.cert.pem ./certs/azure-iot-test-only.intermediate.cert.pem ./certs/azure-iot-test-only.root.ca.cert.pem > ./certs/device-01-full-chain.cert.pem
在文字編輯器中開啟憑證鏈結檔案 ./certs/device-01-full-chain.cert.pem 進行檢查。 憑證鏈結文字包含全部三個憑證的完整鏈結。 您在本教學課程稍後將使用此憑證鏈結來佈建
device-01
。完整的鏈結文字具有下列格式:
-----BEGIN CERTIFICATE----- <Text for the device certificate includes public key> -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- <Text for the intermediate certificate includes public key> -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- <Text for the root certificate includes public key> -----END CERTIFICATE-----
若要為第二部裝置建立私密金鑰、X.509 憑證和完整鏈結憑證,請將此指令碼複製並貼到您的 Git Bash 命令提示字元中。 若要為更多裝置建立憑證,您可以修改在指令碼開頭宣告的
registration_id
變數。registration_id=device-02 echo $registration_id openssl genrsa -out ./private/${registration_id}.key.pem 4096 openssl req -config ./openssl_device_intermediate_ca.cnf -key ./private/${registration_id}.key.pem -subj "//CN=$registration_id" -new -sha256 -out ./csr/${registration_id}.csr.pem openssl ca -batch -config ./openssl_device_intermediate_ca.cnf -passin pass:1234 -extensions usr_cert -days 30 -notext -md sha256 -in ./csr/${registration_id}.csr.pem -out ./certs/${registration_id}.cert.pem cat ./certs/${registration_id}.cert.pem ./certs/azure-iot-test-only.intermediate.cert.pem ./certs/azure-iot-test-only.root.ca.cert.pem > ./certs/${registration_id}-full-chain.cert.pem
重要
只需要針對主體名稱提供的額外正斜線 (
//CN=$registration_id
) 以在 Windows 平台上使用 Git 逸出字串。 在 Linux 平臺上,以單一正斜線 (/CN=$registration_id
) 提供主體名稱。注意
此指令碼使用註冊識別碼作為私密金鑰和憑證檔案的基底檔案名稱。 如果您的註冊識別碼包含了無效的檔案名稱字元,您必須據以修改指令碼。
警告
憑證的文字僅包含公開金鑰資訊。
不過,裝置也必須能夠存取裝置憑證的私密金鑰。 這是必要的,因為當裝置嘗試佈建時,必須在執行階段使用該金鑰來執行驗證。 此金鑰的敏感性是建議在實際的 HSM 中使用硬體型存放裝置,以協助保護私密金鑰的其中一個主要原因。
您會在本教學課程的其餘部分使用下列檔案:
憑證 | 檔案 | 說明 |
---|---|---|
根 CA 憑證。 | certs/azure-iot-test-only.root.ca.cert.pem | 已上傳至 DPS 並經過驗證。 |
中繼 CA 憑證 | certs/azure-iot-test-only.intermediate.cert.pem | 用來在 DPS 中建立註冊群組。 |
device-01 私密金鑰 | private/device-01.key.pem | 由裝置用來在使用 DPS 進行驗證期間驗證裝置憑證的擁有權。 |
device-01 完整鏈結憑證 | certs/device-01-full-chain.cert.pem | 由裝置呈現,以向 DPS 進行驗證和註冊。 |
device-02 私密金鑰 | private/device-02.key.pem | 由裝置用來在使用 DPS 進行驗證期間驗證裝置憑證的擁有權。 |
device-02 完整鏈結憑證 | certs/device-02-full-chain.cert.pem | 由裝置呈現,以向 DPS 進行驗證和註冊。 |
確認根憑證的擁有權
若要讓 DPS 能夠在驗證期間驗證裝置的憑證鏈結,您必須上傳並驗證根 CA 憑證的擁有權。 若要將根 CA 憑證新增至您的 DPS 執行個體,請遵循下列步驟:
在 Azure 入口網站中,瀏覽至您的裝置佈建服務執行個體。
從左側功能表開啟 [憑證 ],然後選取 [新增 ] 以新增憑證。
為您的憑證輸入易記顯示名稱。 瀏覽至根 CA 憑證檔案的位置
certs/azure-iot-test-only.root.ca.cert.pem
。 選取上傳。選取方塊,將 憑證狀態設定為在上傳時驗證。
選取儲存。
確定您的憑證顯示在狀態為 [已驗證] 的憑證索引標籤中。
在 Windows 型裝置上更新憑證存放區
在非 Windows 裝置上,您可以從程式碼將憑證鏈結傳遞為憑證存放區。
在 Windows 型裝置上,您必須將簽署憑證 (根和中繼憑證) 新增至 Windows 憑證存放區。 否則,系統將不會透過傳輸層安全性 (TLS) 安全通道,將簽署憑證傳輸至 DPS。
提示
您也可以使用 OpenSSL,而不是搭配 C SDK 使用安全通道 (Schannel)。 如需使用 OpenSSL 的詳細資訊,請參閱在 SDK 中使用 OpenSSL (英文)。
若要將簽署憑證新增至 Windows 型裝置中的憑證存放區:
在您的 Git Bash 終端機中,將您的簽署憑證
.pfx
轉換為 ,如下所示。根 CA 憑證:
openssl pkcs12 -inkey ./private/azure-iot-test-only.root.ca.key.pem -in ./certs/azure-iot-test-only.root.ca.cert.pem -export -passin pass:1234 -passout pass:1234 -out ./certs/root.pfx
中繼 CA 憑證:
openssl pkcs12 -inkey ./private/azure-iot-test-only.intermediate.key.pem -in ./certs/azure-iot-test-only.intermediate.cert.pem -export -passin pass:1234 -passout pass:1234 -out ./certs/intermediate.pfx
以滑鼠右鍵按兩下 [Windows 開始] 按鈕,然後選取 [ 執行]。 輸入 certmgr.msc ,然後選取 [ 確定 ] 以啟動憑證管理員。
在憑證管理員中的 [憑證 - 目前使用者] 下,選取 [受信任的根憑證授權單位]。 然後在功能表上,選取 [動作>所有工作>匯入]。
請遵循憑證匯入精靈步驟匯入
root.pfx
。- 請務必依個人資訊交換 (.pfx) 搜尋
- 使用
1234
作為密碼。 - 將憑證放在受信任的根憑證授權單位憑證存放區中。
重複這些憑證管理員步驟以匯入
intermediate.pfx
。- 將憑證放在中繼憑證授權單位憑證存放區中。
您的簽署憑證現在已在 Windows 裝置上受到信任,可將完整鏈結傳輸至 DPS。
建立註冊群組
登入 Azure 入口網站,並瀏覽至您的裝置佈建服務執行個體。
從導覽功能表的 [設定] 區段選取 [管理註冊]。
在頁面頂端,選取 [新增註冊群組]。
在 [新增註冊群組] 頁面的 [註冊 + 佈建] 索引標籤上,提供下列資訊以設定註冊群組詳細資料:
欄位 描述 證明 如果您想要上傳中繼憑證僅用於此註冊群組,請選取 [X.509 中繼憑證] 作為 [證明機制],或者如果您已上傳中繼憑證,請選取 [X.509 憑證已上傳至此裝置佈建服務]。 X.509 憑證設定 根據您選擇的證明方法,上傳或選取此註冊群組的主要和次要中繼憑證。 群組名稱 提供裝置群組的名稱。 註冊群組名稱是不區分大小寫的字串 (長度最多為 128 個字元),該字串可包含英數字元加上特殊字元: '-'
、'.'
、'_'
、':'
。 最後一個字元必須是英數字元或虛線 ('-'
)。佈建狀態 如果您想要讓此註冊群組可用於佈建裝置,請核取 [啟用此註冊] 方塊。 如果您想要停用群組,請取消核取此方塊。 您之後無法變更此設定。 重新佈建原則 選擇重新佈建原則,以反映您希望 DPS 如何處理要求重新佈建的裝置。 如需詳細資訊,請參閱重新佈建原則 選取 [下一步:IoT 中樞]。
在 [新增註冊群組] 頁面的 [IoT 中樞] 索引標籤上,提供下列資訊以判斷註冊群組可將裝置佈建到哪些 IoT 中樞:
欄位 描述 目標 IoT 中樞 選取一或多個連結的 IoT 中樞,或是新增 IoT 中樞的連結。 若要深入了解如何將 IoT 中樞連結到 DPS 執行個體,請參閱如何連結和管理 IoT 中樞。 配置原則 如果您選取了多個連結的 IoT 中樞,請選取要如何將裝置指派給不同的中樞。 若要深入了解配置原則,請參閱如何使用配置原則。
如果您只選取一個連結的 IoT 中樞,建議您使用 [權重相等的分佈] 原則。選取 [下一步: 裝置設定]
在 [新增註冊群組] 頁面的 [裝置設定] 索引標籤上,提供下列資訊以定義新佈建裝置的設定方式:
欄位 描述 IoT Edge 如果所有透過此群組佈建的裝置都會執行 Azure IoT Edge,請核取 [在佈建的裝置上啟用 IoT Edge]。 如果此群組僅適用於未啟用 IoT Edge 的裝置,請取消核取此方塊。 群組中的所有裝置必須全部啟用 IoT Edge,或全部未啟用。 裝置標籤 使用此文字輸入框來提供您要套用至已佈建裝置之裝置對應項的任何標籤。 所需屬性 使用此文字輸入框來提供您要套用至已佈建裝置之裝置對應項的任何所需屬性。 如需詳細資訊,請參閱了解和使用 Azure IoT 中樞的裝置對應項。
完成時,選取 [下一步:檢閱 + 建立]。
在 [檢閱 + 建立] 索引標籤上,確認所有值,然後選取 [建立]。
準備並執行裝置佈建程式碼
在本節中,您會使用自己的裝置佈建服務執行個體資訊來更新範例程式碼。 如果裝置已通過驗證,則會指派給連結至本節中所設定裝置佈建服務執行個體的 IoT 中樞。
在本節中,您會使用 Git Bash 命令提示字元和 Visual Studio IDE。
設定佈建裝置程式碼
在本節中,您會使用自己的裝置佈建服務執行個體資訊來更新範例程式碼。
在 Azure 入口網站中,選取您裝置佈建服務執行個體的 [概觀] 索引標籤,並記下 [識別碼範圍] 值。
啟動 Visual Studio 並開啟新的解決方案檔,此檔案是在您於 azure-iot-sdk-c git 存放庫之根目錄中建立的
cmake
目錄中建立。 解決方案檔命名為azure_iot_sdks.sln
。在 Visual Studio 的方案總管中,瀏覽至 [Provision_Samples] > [prov_dev_client_sample] > [來源檔案] 並開啟 prov_dev_client_sample.c。
找出
id_scope
常數,並將其值取代為您先前複製的 [識別碼範圍] 值。 例如:static const char* id_scope = "0ne00000A0A";
在相同的檔案中找出
main()
函式的定義。 確定將hsm_type
變數設定為SECURE_DEVICE_TYPE_X509
,並將所有其他hsm_type
行註解化。例如:SECURE_DEVICE_TYPE hsm_type; //hsm_type = SECURE_DEVICE_TYPE_TPM; hsm_type = SECURE_DEVICE_TYPE_X509; //hsm_type = SECURE_DEVICE_TYPE_SYMMETRIC_KEY;
儲存您的變更。
以滑鼠右鍵按一下 [prov_dev_client_sample] 專案,然後選取 [設為起始專案]。
設定自訂 HSM 虛設常式程式碼
與實際安全硬體型存放裝置互動的細節會因裝置硬體而異。 本教學課程中模擬裝置所使用的憑證鏈結將會在自訂 HSM 虛設常式程式碼中進行硬式編碼。 在實際案例中,憑證鏈結會儲存在實際的 HSM 硬體中,為機密資訊提供更理想的安全性。 接著會執行與此範例中所使用虛設常式類似的方法,從該硬體型存放裝置讀取祕密。
雖然不需要 HSM 硬體,但建議您保護敏感性資訊,例如憑證的私密金鑰。 如果範例呼叫的是實際 HSM,則私密金鑰不會出現在原始程式碼中。 請將原始程式碼中的金鑰公開給任何可檢視程式碼的人。 這只會在本教學課程中進行,目的是協助您學習。
若要更新自訂 HSM 虛設常式程式碼,以模擬識別碼為 device-01
的裝置身分識別:
在 Visual Studio 的方案總管中,瀏覽至 [Provision_Samples] > [custom_hsm_example] > [來源檔案] 並開啟 custom_hsm_example.c。
使用您在產生裝置憑證時所使用的一般名稱,更新
COMMON_NAME
字串常數的字串值。static const char* const COMMON_NAME = "device-01";
在 Git Bash 終端機中,執行下列命令來產生裝置憑證的字串常數:
sed -e 's/^/"/;$ !s/$/""\\n"/;$ s/$/"/' ./certs/device-01-full-chain.cert.pem
複製此命令的輸出。
產生憑證之後,請使用您在 ./certs/device-01-full-chain.cert.pem 中儲存的憑證鏈結來更新
CERTIFICATE
常數字串的字串值。 針對常數值,使用上一個步驟中的輸出憑證文字。憑證文字的語法必須符合下列模式,且Visual Studio不會有額外的空格或剖析。
// <Device/leaf cert> // <intermediates> // <root> static const char* const CERTIFICATE = "-----BEGIN CERTIFICATE-----\n" "MIIFOjCCAyKgAwIBAgIJAPzMa6s7mj7+MA0GCSqGSIb3DQEBCwUAMCoxKDAmBgNV\n" ... "MDMwWhcNMjAxMTIyMjEzMDMwWjAqMSgwJgYDVQQDDB9BenVyZSBJb1QgSHViIENB\n" "-----END CERTIFICATE-----\n" "-----BEGIN CERTIFICATE-----\n" "MIIFPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQsFADAqMSgwJgYDVQQDDB9BenVy\n" ... "MTEyMjIxMzAzM1owNDEyMDAGA1UEAwwpQXp1cmUgSW9UIEh1YiBJbnRlcm1lZGlh\n" "-----END CERTIFICATE-----\n" "-----BEGIN CERTIFICATE-----\n" "MIIFOjCCAyKgAwIBAgIJAPzMa6s7mj7+MA0GCSqGSIb3DQEBCwUAMCoxKDAmBgNV\n" ... "MDMwWhcNMjAxMTIyMjEzMDMwWjAqMSgwJgYDVQQDDB9BenVyZSBJb1QgSHViIENB\n" "-----END CERTIFICATE-----";
在 Git Bash 中,執行下列命令來產生裝置私鑰的字串常數:
sed -e 's/^/"/;$ !s/$/""\\n"/;$ s/$/"/' ./private/device-01.key.pem
複製此命令的輸出。
將
PRIVATE_KEY
常數的字串值更新為您裝置憑證的私密金鑰。 針對常數值,使用上一個步驟中的輸出私鑰文字。私鑰文字的語法必須符合下列模式,且 Visual Studio 不會有額外的空格或剖析。
static const char* const PRIVATE_KEY = "-----BEGIN RSA PRIVATE KEY-----\n" "MIIJJwIBAAKCAgEAtjvKQjIhp0EE1PoADL1rfF/W6v4vlAzOSifKSQsaPeebqg8U\n" ... "X7fi9OZ26QpnkS5QjjPTYI/wwn0J9YAwNfKSlNeXTJDfJ+KpjXBcvaLxeBQbQhij\n" "-----END RSA PRIVATE KEY-----";
儲存您的變更。
以滑鼠右鍵按一下 custom_hsm_example 專案,然後選取 [建置]。
重要
在下一節中,您必須先建置 custom_hsm_example 專案,再建置方案的其餘部分。
執行範例
在 Visual Studio 功能表中,選取 [偵錯]>[啟動但不偵錯] 以執行解決方案。 出現重新建置專案的提示時,選取 [是],以在執行前重新建置專案。
下列輸出範例指出模擬裝置
device-01
已成功啟動並連線到佈建服務。 裝置已指派至 IoT 中樞資訊並已註冊:Provisioning API Version: 1.8.0 Registering Device Provisioning Status: PROV_DEVICE_REG_STATUS_CONNECTED Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING Registration Information received from service: contoso-hub-2.azure-devices.net, deviceId: device-01 Press enter key to exit:
針對您的第二部裝置 (
device-02
) 重複設定自訂 HSM 虛設常式程式碼中的步驟,然後再次執行範例。 針對該裝置使用下列值:描述 值 一般名稱 "device-02"
完整憑證鏈結 使用 ./certs/device-02-full-chain.cert.pem 產生文字 私密金鑰 使用 ./private/device-02.key.pem 產生文字 下列輸出範例指出模擬裝置
device-02
已成功啟動並連線到佈建服務。 裝置已指派至 IoT 中樞資訊並已註冊:Provisioning API Version: 1.8.0 Registering Device Provisioning Status: PROV_DEVICE_REG_STATUS_CONNECTED Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING Registration Information received from service: contoso-hub-2.azure-devices.net, deviceId: device-02 Press enter key to exit:
C# 範例程式碼設定為使用儲存在受密碼保護之 PKCS#12 格式檔案 (.pfx) 中的 X.509 憑證。 您先前建立的完整鏈結憑證為 PEM 格式。 若要將完整鏈結憑證轉換為 PKCS#12 格式,請從您先前執行 OpenSSL 命令的目錄,在 Git Bash 命令提示字元中輸入下列命令。
device-01
openssl pkcs12 -inkey ./private/device-01.key.pem -in ./certs/device-01-full-chain.cert.pem -export -passin pass:1234 -passout pass:1234 -out ./certs/device-01-full-chain.cert.pfx
device-02
openssl pkcs12 -inkey ./private/device-02.key.pem -in ./certs/device-02-full-chain.cert.pem -export -passin pass:1234 -passout pass:1234 -out ./certs/device-02-full-chain.cert.pfx
在本節的其餘部分,使用您的 Windows 命令提示字元。
在 Azure 入口網站中,選取您裝置佈建服務的 [概觀] 索引標籤。
複製 [識別碼範圍] 值。
在您的 Windows 命令提示字元中,變更為 X509Sample 目錄。 此目錄位於您在先前步驟中複製的 SDK 存放庫: .\azure-iot-sdk-csharp\provisioning\device\samples\getting started\X509Sample。
輸入下列命令來建置並執行 X.509 裝置布建範例。 將取代
<id-scope>
為您從 Azure 入口網站 複製的標識元範圍。 將<your-certificate-folder>
取代為您執行 OpenSSL 命令的資料夾路徑。dotnet run -- -s <id-scope> -c <your-certificate-folder>\certs\device-01-full-chain.cert.pfx -p 1234
裝置會連線到 DPS,並指派給 IoT 中樞。 然後,裝置會將遙測訊息傳送至 IoT 中樞。 您應該會看到類似下列範例的結果:
Loading the certificate... Found certificate: 3E5AA3C234B2032251F0135E810D75D38D2AA477 CN=Azure IoT Hub CA Cert Test Only; PrivateKey: False Found certificate: 81FE182C08D18941CDEEB33F53F8553BA2081E60 CN=Azure IoT Hub Intermediate Cert Test Only; PrivateKey: False Found certificate: 5BA1DB226D50EBB7A6A6071CED4143892855AE43 CN=device-01; PrivateKey: True Using certificate 5BA1DB226D50EBB7A6A6071CED4143892855AE43 CN=device-01 Initializing the device provisioning client... Initialized for registration Id device-01. Registering with the device provisioning service... Registration status: Assigned. Device device-01 registered to contoso-hub-2.azure-devices.net. Creating X509 authentication for IoT Hub... Testing the provisioned device with IoT Hub... Sending a telemetry message... Finished.
注意
如果您未在命令列上指定憑證和密碼,憑證檔案預設為 ./certificate.pfx,且系統會提示您輸入密碼。
您可以傳遞其他參數來變更 TransportType (-t) 和 GlobalDeviceEndpoint (-g)。 如需完整的參數清單,請鍵入
dotnet run -- --help
。若要註冊您的第二部裝置,請使用其完整鏈結憑證重新執行範例。
dotnet run -- -s <id-scope> -c <your-certificate-folder>\certs\device-02-full-chain.cert.pfx -p 1234
在下列步驟中,使用您的 Windows 命令提示字元。
在 Azure 入口網站中,選取您裝置佈建服務的 [概觀] 索引標籤。
複製 [識別碼範圍] 值。
在您的 Windows 命令提示字元中,前往範例目錄,然後安裝範例所需的套件。 所顯示的路徑是您複製 SDK 之目的地位置的相對路徑。
cd .\azure-iot-sdk-node\provisioning\device\samples npm install
在 provisioning\device\samples 資料夾中,開啟 register_x509.js 並檢閱程式碼。
此範例預設使用 MQTT 作為傳輸通訊協定。 如果您想要使用不同的通訊協定,請將下一行註解化,並將適當的通訊協定行取消註解。
var ProvisioningTransport = require('azure-iot-provisioning-device-mqtt').Mqtt;
此範例使用五個環境變數透過 DPS 來驗證和佈建 IoT 裝置。 這些環境變數包括:
變數名稱 描述 PROVISIONING_HOST
用於連線到 DPS 執行個體的端點。 在本教學課程中,請使用全域端點 global.azure-devices-provisioning.net
。PROVISIONING_IDSCOPE
您 DPS 執行個體的識別碼範圍。 PROVISIONING_REGISTRATION_ID
您裝置的註冊識別碼。 必須符合裝置憑證中的主體通用名稱。 CERTIFICATE_FILE
您裝置完整鏈結憑證檔案的路徑。 KEY_FILE
您裝置憑證私密金鑰檔案的路徑。 ProvisioningDeviceClient.register()
方法會嘗試註冊您的裝置。新增全域裝置端點和識別碼範圍的環境變數。 將取代
<id-scope>
為您從 Azure 入口網站 複製的值。set PROVISIONING_HOST=global.azure-devices-provisioning.net set PROVISIONING_IDSCOPE=<id-scope>
設定裝置註冊識別碼的環境變數。 IoT 裝置的註冊識別碼必須符合其裝置憑證上的主體通用名稱。 在本教學課程中,device-01 同時是裝置的主體名稱和註冊識別碼。
set PROVISIONING_REGISTRATION_ID=device-01
設定您先前所產生裝置完整鏈結憑證和裝置私密金鑰檔案的環境變數。 將
<your-certificate-folder>
取代為您執行 OpenSSL 命令的資料夾路徑。set CERTIFICATE_FILE=<your-certificate-folder>\certs\device-01-full-chain.cert.pem set KEY_FILE=<your-certificate-folder>\private\device-01.key.pem
執行範例,並確認已成功佈建裝置。
node register_x509.js
您應該會看到類似下列範例的結果:
registration succeeded assigned hub=contoso-hub-2.azure-devices.net deviceId=device-01 Client connected send status: MessageEnqueued
根據下表更新第二個裝置的環境變數,
device-02
然後再次執行範例。環境變數 值 PROVISIONING_REGISTRATION_ID device-02
CERTIFICATE_FILE <your-certificate-folder>\certs\device-02-full-chain.cert.pem KEY_FILE <your-certificate-folder>\private\device-02.key.pem
在下列步驟中,使用您的 Windows 命令提示字元。
在 Azure 入口網站中,選取您裝置佈建服務的 [概觀] 索引標籤。
複製 [識別碼範圍]。
在您的 Windows 命令提示字元中,前往 provision_x509.py 範例的目錄。 所顯示的路徑是您複製 SDK 之目的地位置的相對路徑。
cd .\azure-iot-sdk-python\samples\async-hub-scenarios
此範例使用六個環境變數透過 DPS 來驗證和佈建 IoT 裝置。 這些環境變數包括:
變數名稱 描述 PROVISIONING_HOST
用於連線到 DPS 執行個體的端點。 在本教學課程中,請使用全域端點 global.azure-devices-provisioning.net
。PROVISIONING_IDSCOPE
您 DPS 執行個體的識別碼範圍。 DPS_X509_REGISTRATION_ID
您裝置的註冊識別碼。 必須符合裝置憑證中的主體通用名稱。 X509_CERT_FILE
您裝置完整鏈結憑證檔案的路徑。 X509_KEY_FILE
您裝置憑證私密金鑰檔案的路徑。 PASS_PHRASE
用來加密私密金鑰檔案的複雜密碼 (如有使用)。 本教學課程不需要。 新增全域裝置端點和標識符範圍的環境變數。 針對標識元範圍變數,請使用您從 Azure 入口網站 複製的值。
set PROVISIONING_HOST=global.azure-devices-provisioning.net set PROVISIONING_IDSCOPE=<ID scope for your DPS resource>
設定裝置註冊識別碼的環境變數。 IoT 裝置的註冊識別碼必須符合其裝置憑證上的主體通用名稱。 在本教學課程中,device-01 同時是裝置的主體名稱和註冊識別碼。
set DPS_X509_REGISTRATION_ID=device-01
設定您先前所產生裝置完整鏈結憑證和裝置私密金鑰檔案的環境變數。 將
<your-certificate-folder>
取代為您執行 OpenSSL 命令的資料夾路徑。set X509_CERT_FILE=<your-certificate-folder>\certs\device-01-full-chain.cert.pem set X509_KEY_FILE=<your-certificate-folder>\private\device-01.key.pem
檢閱 provision_x509.py 的程式碼。 如果您未使用 Python 3.7 版或更新版本,請進行此處所述的程式碼變更以取代
asyncio.run(main())
。執行範例。 此範例會連線到 DPS,以將裝置佈建到 IoT 中樞。 佈建裝置之後,此範例會將一些測試訊息傳送至 IoT 中樞。
python provision_x509.py
您應該會看到類似下列範例的結果:
The complete registration result is device-01 contoso-hub-2.azure-devices.net initialAssignment null Will send telemetry from the provisioned device sending message #1 sending message #2 sending message #3 sending message #4 sending message #5 sending message #6 sending message #7 sending message #8 sending message #9 sending message #10 done sending message #1 done sending message #2 done sending message #3 done sending message #4 done sending message #5 done sending message #6 done sending message #7 done sending message #8 done sending message #9 done sending message #10
根據下表更新第二個裝置的環境變數,
device-02
然後再次執行範例。環境變數 值 DPS_X509_REGISTRATION_ID device-02
X509_CERT_FILE <your-certificate-folder>\certs\device-02-full-chain.cert.pem X509_KEY_FILE <your-certificate-folder>\private\device-02.key.pem
在下列步驟中,您會使用 Windows 命令提示字元和 Git Bash 命令提示字元。
在 Azure 入口網站中,選取您裝置佈建服務的 [概觀] 索引標籤。
複製 [識別碼範圍]。
在您的 Windows 命令提示字元中,瀏覽至範例專案資料夾。 所顯示的路徑是您複製 SDK 之目的地位置的相對路徑
cd .\azure-iot-sdk-java\provisioning\provisioning-device-client-samples\provisioning-X509-sample
在範例程式碼中輸入佈建服務和 X.509 身分識別資訊。 這會在佈建期間用於證明模擬裝置,再註冊裝置。
在您慣用的編輯器中開啟
.\src\main\java\samples\com\microsoft\azure\sdk\iot\ProvisioningX509Sample.java
檔案。更新下列值。 針對
idScope
,使用您先前複製的 [識別碼範圍]。 針對全域端點,使用 [全域裝置端點]。 對於每個 DPS 執行個體,這個端點同樣都是global.azure-devices-provisioning.net
。private static final String idScope = "[Your ID scope here]"; private static final String globalEndpoint = "[Your Provisioning Service Global Endpoint here]";
此範例預設使用 HTTPS 作為傳輸通訊協定。 如果您想要變更通訊協定,請將下一行註解化,並將您要使用的通訊協定行取消註解。
private static final ProvisioningDeviceClientTransportProtocol PROVISIONING_DEVICE_CLIENT_TRANSPORT_PROTOCOL = ProvisioningDeviceClientTransportProtocol.HTTPS;
將
leafPublicPem
常數字串的值更新為您裝置憑證的值 device-01.cert.pem。憑證文字的語法必須符合下列模式,且沒有額外的空格或字元。
private static final String leafPublicPem = "-----BEGIN CERTIFICATE-----\n" "MIIFOjCCAyKgAwIBAgIJAPzMa6s7mj7+MA0GCSqGSIb3DQEBCwUAMCoxKDAmBgNV\n" ... "MDMwWhcNMjAxMTIyMjEzMDMwWjAqMSgwJgYDVQQDDB9BenVyZSBJb1QgSHViIENB\n" "-----END CERTIFICATE-----";
手動更新此字串值很容易發生錯誤。 若要產生適當的語法,您可以將下列命令複製並貼到 Git Bash 命令提示字元中,然後按 ENTER 鍵。 此命令會產生
leafPublicPem
字串常數值的語法,並將其寫入到輸出。sed 's/^/"/;$ !s/$/\\n" +/;$ s/$/"/' ./certs/device-01.cert.pem
複製並貼上常數值的輸出憑證文字。
將
leafPrivateKey
常數的字串值更新為您裝置憑證未加密的私密金鑰 unencrypted-device-key.pem。私鑰文字的語法必須符合下列模式,且沒有額外的空格或字元。
private static final String leafPrivateKey = "-----BEGIN PRIVATE KEY-----\n" + "MIIJJwIBAAKCAgEAtjvKQjIhp0EE1PoADL1rfF/W6v4vlAzOSifKSQsaPeebqg8U\n" + ... "X7fi9OZ26QpnkS5QjjPTYI/wwn0J9YAwNfKSlNeXTJDfJ+KpjXBcvaLxeBQbQhij\n" + "-----END PRIVATE KEY-----";
若要產生適當的語法,您可以將下列命令複製並貼到 Git Bash 命令提示字元中,然後按 ENTER 鍵。 此命令會產生
leafPrivateKey
字串常數值的語法,並將其寫入到輸出。sed 's/^/"/;$ !s/$/\\n" +/;$ s/$/"/' ./private/device-01.key.pem
複製並貼上常數值的輸出私密金鑰文字。
使用您的根 CA 憑證值 azure-iot-test-only.root.ca.cert.pem 新增
rootPublicPem
常數字串。 您可以將其新增至leafPrivateKey
常數之後。憑證文字的語法必須符合下列模式,且沒有額外的空格或字元。
private static final String rootPublicPem = "-----BEGIN CERTIFICATE-----\n" "MIIFOjCCAyKgAwIBAgIJAPzMa6s7mj7+MA0GCSqGSIb3DQEBCwUAMCoxKDAmBgNV\n" ... "MDMwWhcNMjAxMTIyMjEzMDMwWjAqMSgwJgYDVQQDDB9BenVyZSBJb1QgSHViIENB\n" "-----END CERTIFICATE-----";
若要產生適當的語法,您可以將下列命令複製並貼到 Git Bash 命令提示字元中,然後按 ENTER 鍵。 此命令會產生
rootPublicPem
字串常數值的語法,並將其寫入到輸出。sed 's/^/"/;$ !s/$/\\n" +/;$ s/$/"/' ./certs/azure-iot-test-only.root.ca.cert.pem
複製並貼上常數值的輸出憑證文字。
使用您的中繼 CA 憑證值 azure-iot-test-only.intermediate.cert.pem 新增
intermediatePublicPem
常數字串。 您可以將其新增至上一個常數之後。憑證文字的語法必須符合下列模式,且沒有額外的空格或字元。
private static final String intermediatePublicPem = "-----BEGIN CERTIFICATE-----\n" "MIIFOjCCAyKgAwIBAgIJAPzMa6s7mj7+MA0GCSqGSIb3DQEBCwUAMCoxKDAmBgNV\n" ... "MDMwWhcNMjAxMTIyMjEzMDMwWjAqMSgwJgYDVQQDDB9BenVyZSBJb1QgSHViIENB\n" "-----END CERTIFICATE-----";
若要產生適當的語法,您可以將下列命令複製並貼到 Git Bash 命令提示字元中,然後按 ENTER 鍵。 此命令會產生
intermediatePublicPem
字串常數值的語法,並將其寫入到輸出。sed 's/^/"/;$ !s/$/\\n" +/;$ s/$/"/' ./certs/azure-iot-test-only.intermediate.cert.pem
複製並貼上常數值的輸出憑證文字。
在
main
方法中尋找下列幾行。// For group enrollment uncomment this line //signerCertificatePemList.add("<Your Signer/intermediate Certificate Here>");
將這兩行直接新增至下方,以將中繼和根 CA 憑證新增至簽署鏈結。 您的簽署鏈結應該包含整個憑證鏈結,包括您已向 DPS 驗證的憑證。
signerCertificatePemList.add(intermediatePublicPem); signerCertificatePemList.add(rootPublicPem);
注意
新增簽署憑證的順序很重要。 如果變更此順序,範例將會失敗。
儲存您的變更。
建置範例,然後前往
target
資料夾。mvn clean install cd target
此組建會以
provisioning-x509-sample-{version}-with-deps.jar
的檔案格式輸出target
資料夾中的 .jar 檔案,例如:provisioning-x509-sample-1.8.1-with-deps.jar
。 執行 .jar 檔案。 您可能需要取代下列命令中的版本。java -jar ./provisioning-x509-sample-1.8.1-with-deps.jar
此範例會連線到 DPS,以將裝置佈建到 IoT 中樞。 佈建裝置之後,此範例會將一些測試訊息傳送至 IoT 中樞。
Starting... Beginning setup. WARNING: sun.reflect.Reflection.getCallerClass is not supported. This will impact performance. 2022-10-21 10:41:20,476 DEBUG (main) [com.microsoft.azure.sdk.iot.provisioning.device.ProvisioningDeviceClient] - Initialized a ProvisioningDeviceClient instance using SDK version 2.0.2 2022-10-21 10:41:20,479 DEBUG (main) [com.microsoft.azure.sdk.iot.provisioning.device.ProvisioningDeviceClient] - Starting provisioning thread... Waiting for Provisioning Service to register 2022-10-21 10:41:20,482 INFO (global.azure-devices-provisioning.net-4f8279ac-CxnPendingConnectionId-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Opening the connection to device provisioning service... 2022-10-21 10:41:20,652 INFO (global.azure-devices-provisioning.net-4f8279ac-Cxn4f8279ac-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Connection to device provisioning service opened successfully, sending initial device registration message 2022-10-21 10:41:20,680 INFO (global.azure-devices-provisioning.net-4f8279ac-Cxn4f8279ac-azure-iot-sdk-RegisterTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.RegisterTask] - Authenticating with device provisioning service using x509 certificates 2022-10-21 10:41:21,603 INFO (global.azure-devices-provisioning.net-4f8279ac-Cxn4f8279ac-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Waiting for device provisioning service to provision this device... 2022-10-21 10:41:21,605 INFO (global.azure-devices-provisioning.net-4f8279ac-Cxn4f8279ac-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Current provisioning status: ASSIGNING 2022-10-21 10:41:24,868 INFO (global.azure-devices-provisioning.net-4f8279ac-Cxn4f8279ac-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Device provisioning service assigned the device successfully IotHUb Uri : contoso-hub-2.azure-devices.net Device ID : device-01 2022-10-21 10:41:30,514 INFO (main) [com.microsoft.azure.sdk.iot.device.transport.ExponentialBackoffWithJitter] - NOTE: A new instance of ExponentialBackoffWithJitter has been created with the following properties. Retry Count: 2147483647, Min Backoff Interval: 100, Max Backoff Interval: 10000, Max Time Between Retries: 100, Fast Retry Enabled: true 2022-10-21 10:41:30,526 INFO (main) [com.microsoft.azure.sdk.iot.device.transport.ExponentialBackoffWithJitter] - NOTE: A new instance of ExponentialBackoffWithJitter has been created with the following properties. Retry Count: 2147483647, Min Backoff Interval: 100, Max Backoff Interval: 10000, Max Time Between Retries: 100, Fast Retry Enabled: true 2022-10-21 10:41:30,533 DEBUG (main) [com.microsoft.azure.sdk.iot.device.DeviceClient] - Initialized a DeviceClient instance using SDK version 2.1.2 2022-10-21 10:41:30,590 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.MqttIotHubConnection] - Opening MQTT connection... 2022-10-21 10:41:30,625 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sending MQTT CONNECT packet... 2022-10-21 10:41:31,452 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sent MQTT CONNECT packet was acknowledged 2022-10-21 10:41:31,453 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sending MQTT SUBSCRIBE packet for topic devices/device-01/messages/devicebound/# 2022-10-21 10:41:31,523 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sent MQTT SUBSCRIBE packet for topic devices/device-01/messages/devicebound/# was acknowledged 2022-10-21 10:41:31,525 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.MqttIotHubConnection] - MQTT connection opened successfully 2022-10-21 10:41:31,528 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - The connection to the IoT Hub has been established 2022-10-21 10:41:31,531 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Updating transport status to new status CONNECTED with reason CONNECTION_OK 2022-10-21 10:41:31,532 DEBUG (main) [com.microsoft.azure.sdk.iot.device.DeviceIO] - Starting worker threads 2022-10-21 10:41:31,535 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Invoking connection status callbacks with new status details 2022-10-21 10:41:31,536 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Client connection opened successfully 2022-10-21 10:41:31,537 INFO (main) [com.microsoft.azure.sdk.iot.device.DeviceClient] - Device client opened successfully Sending message from device to IoT Hub... 2022-10-21 10:41:31,539 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Message was queued to be sent later ( Message details: Correlation Id [aaaa0000-bb11-2222-33cc-444444dddddd] Message Id [aaaa0000-bb11-2222-33cc-444444dddddd] ) Press any key to exit... 2022-10-21 10:41:31,540 DEBUG (contoso-hub-2.azure-devices.net-device-01-d7c67552-Cxn0bd73809-420e-46fe-91ee-942520b775db-azure-iot-sdk-IotHubSendTask) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Sending message ( Message details: Correlation Id [aaaa0000-bb11-2222-33cc-444444dddddd] Message Id [aaaa0000-bb11-2222-33cc-444444dddddd] ) 2022-10-21 10:41:31,844 DEBUG (MQTT Call: device-01) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - IotHub message was acknowledged. Checking if there is record of sending this message ( Message details: Correlation Id [aaaa0000-bb11-2222-33cc-444444dddddd] Message Id [aaaa0000-bb11-2222-33cc-444444dddddd] ) 2022-10-21 10:41:31,846 DEBUG (contoso-hub-2.azure-devices.net-device-01-d7c67552-Cxn0bd73809-420e-46fe-91ee-942520b775db-azure-iot-sdk-IotHubSendTask) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Invoking the callback function for sent message, IoT Hub responded to message ( Message details: Correlation Id [aaaa0000-bb11-2222-33cc-444444dddddd] Message Id [aaaa0000-bb11-2222-33cc-444444dddddd] ) with status OK Message sent!
根據下表更新第二個裝置的
device-02
常數、重建,然後再次執行範例。常數 要使用的檔案 leafPublicPem
./certs/device-02.cert.pem leafPrivateKey
./private/device-02.key.pem
確認您的裝置佈建註冊
檢查註冊群組的註冊記錄,以查看您裝置的註冊詳細資料:
在 Azure 入口網站中,移至您的裝置佈建服務執行個體。
在 [設定] 功能表中,選取 [管理註冊]。
選取 [註冊群組]。 您先前建立的 X.509 註冊群組項目應該會出現在清單中。
選取註冊項目。 然後選取 [註冊狀態] 旁的 [詳細資料],查看已透過註冊群組註冊的裝置。 每部裝置的指派目的地 IoT 中樞、其裝置識別碼,以及註冊的日期和時間,都會出現在清單中。
您可以選取其中一部裝置來查看該裝置的進一步詳細資料。
若要確認 IoT 中樞上的裝置:
在 Azure 入口網站中,前往您裝置的指派目的地 IoT 中樞。
在 [裝置管理] 功能表中,選取 [裝置]。
如果您的裝置已成功佈建,則其裝置識別碼 device-01 和 device-02 應該會出現在清單中,且 [狀態] 設定為 [已啟用]。 如果您沒有看到裝置,請選取 [重新整理]。
清除資源
完成測試並探索此裝置用戶端範例時,請使用下列步驟來刪除本教學課程所建立的所有資源。
- 在您的電腦上關閉裝置用戶端範例輸出視窗。
刪除您的註冊群組
從 Azure 入口網站中的左側功能表,選取 [所有資源]。
選取您的 DPS 執行個體。
在 [設定] 功能表中,選取 [管理註冊]。
選取 [註冊群組] 索引標籤。
選取您在本教學課程中使用的註冊群組。
在 [註冊詳細資料] 頁面上,選取 [註冊狀態] 旁的 [詳細資料]。 然後選取 [裝置識別碼] 資料行標頭旁的核取方塊,以選取註冊群組的所有註冊記錄。 選取頁面頂端的 [刪除],以刪除註冊記錄。
重要
刪除註冊群組不會刪除與其相關聯的註冊記錄。 這些孤立的記錄會計入 DPS 執行個體的註冊配額。 因此,最好先刪除與註冊群組相關聯的所有註冊記錄,再刪除註冊群組本身。
返回 [管理註冊] 頁面,並確定已選取 [註冊群組] 索引標籤。
選取您在本教學課程中所使用註冊群組之群組名稱旁的核取方塊。
在頁面頂端,選取 [刪除]。
從 DPS 刪除已註冊的 CA 憑證
- 從 DPS 執行個體的左側功能表選取 [憑證]。 針對您在本教學課程中上傳和驗證的每個憑證,選取憑證,然後選取 [刪除] 並確認選擇將其移除。
從IoT 中樞 刪除裝置註冊
從 Azure 入口網站中的左側功能表,選取 [所有資源]。
選取您的 IoT 中樞。
在總管功能表中,選取 [IoT 裝置]。
選取您在本教學課程中所註冊裝置之裝置識別碼旁的核取方塊。 例如,device-01 和 device-02。
在頁面頂端,選取 [刪除]。
下一步
在本教學課程中,您已使用註冊群組將多部 X.509 裝置佈建到 IoT 中樞。 接下來,了解如何跨多個中樞佈建 IoT 裝置。