Share via


將 Azure IoT Edge 裝置連線以建立階層

適用於:IoT Edge 1.5 複選標記 IoT Edge 1.5 IoT Edge 1.4 複選標記 IoT Edge 1.4

重要

支援 IoT Edge 1.5 LTS 和 IoT Edge 1.4 LTS 版本。 IoT Edge 1.4 LTS 於 2024 年 11 月 12 日結束生命週期。 如果您是舊版,請參閱更新 IoT Edge

本文提供在IoT Edge閘道與下游IoT Edge裝置之間建立信任連線的步驟。 此設定也稱為 巢狀邊緣

在閘道案例中,IoT Edge 裝置可以是閘道和下游裝置。 您可以分層多個IoT Edge閘道來建立裝置階層。 下游(子系)裝置可以透過其閘道(父系)裝置來驗證和傳送或接收訊息。

網關階層中的IoT Edge裝置有兩個不同的組態,本文同時說明這兩者。 第一個是 最上層 IoT Edge 裝置。 當多個 IoT Edge 裝置彼此連線時,任何沒有父裝置但直接連線到 IoT 中樞 的裝置都會被視為位於最上層。 此裝置負責處理其下方所有裝置的要求。 其他組態適用於階層較低層中的任何 IoT Edge 裝置。 這些裝置可能是其他下游 IoT 和 IoT Edge 裝置的閘道,但也需要透過自己的父裝置路由傳送任何通訊。

某些網路架構要求只有階層中的最上層 IoT Edge 裝置可以連線到雲端。 在此設定中,階層較低層中的所有IoT Edge裝置只能與其閘道 (父系) 裝置和任何下游 (子) 裝置通訊。

本文中的所有步驟都以設定IoT Edge裝置作為透明閘道為基礎,其會將IoT Edge裝置設定為下游IoT裝置的閘道。 相同的基本步驟適用於所有閘道案例:

  • 驗證:為閘道階層中的所有裝置建立 IoT 中樞 身分識別。
  • 授權:在 IoT 中樞 中設定父/子關聯性,以授權下游裝置連線到其父裝置,就像連線到 IoT 中樞 一樣。
  • 網關探索:確定下游裝置可以在局域網路上找到其父裝置。
  • 安全連線:使用屬於相同鏈結一部分的受信任憑證建立安全連線。

必要條件

  • 免費或標準IoT中樞。
  • 至少兩 個IoT Edge裝置,一個是頂層裝置和一或多個較低層裝置。 如果您沒有可用的 IoT Edge 裝置,您可以在 Ubuntu 虛擬機上執行 Azure IoT Edge。
  • 如果您使用 Azure CLI 來建立和管理裝置,請安裝 Azure IoT 擴充功能

提示

本文提供詳細的步驟和選項,可協助您為案例建立正確的網關階層。 如需引導式教學課程,請參閱 使用閘道建立IoT Edge裝置的階層。

建立閘道階層

您可以在案例中定義IoT Edge裝置的父/子關聯性,以建立IoT Edge閘道階層。 您可以在建立新的裝置身分識別時設定父裝置,也可以管理現有裝置身分識別的父系和子系。

設定父/子關聯性的步驟會授權下游裝置連線到其父裝置,就像連線到 IoT 中樞 一樣。

只有 IoT Edge 裝置可以是父裝置,但 IoT Edge 裝置和 IoT 裝置可以是子系。 父代可以有許多子系,但子系只能有一個父系。 網關階層是由將父/子集鏈結在一起所建立,讓某個裝置的子系成為另一個裝置的父系。

根據預設,父代最多可以有 100 個子系。 您可以在父裝置的edgeHub模組中設定 Max 連線 edClients 環境變數,以變更此限制。

在 Azure 入口網站 中,您可以在建立新的裝置身分識別或編輯現有裝置時管理父/子關聯性。

當您建立新的 IoT Edge 裝置時,您可以選擇從該中樞的現有 IoT Edge 裝置清單中選擇父裝置和子裝置。

  1. Azure 入口網站中,瀏覽至您的 IoT 中樞。
  2. 選取 [裝置管理] 功能表下的 [裝置]。
  3. 選取 [ 新增裝置 ],然後核取 [ IoT Edge 裝置 ] 複選框。
  4. 除了設定裝置識別碼和驗證設定之外,您也可以 設定父裝置選擇子裝置
  5. 選擇您想要作為父系或子系的裝置。

您也可以建立或管理現有裝置的父/子關聯性。

  1. Azure 入口網站中,瀏覽至您的 IoT 中樞。
  2. 在 [裝置管理] 功能選取 [裝置]。
  3. 從清單中選取您想要管理的IoT Edge裝置
  4. 選取 [ 設定父裝置齒輪 ] 圖示或 [管理子裝置]。
  5. 新增或移除任何父裝置或子裝置。

注意

如果您想要以程序設計方式建立父子關聯性,可以使用 C#、Java 或 Node.js IoT 中樞 Service SDK

以下是 使用 C# SDK 指派子裝置 的範例。 RegistryManager_AddAndRemoveDeviceWithScope()工作示範如何以程序設計方式建立三層階層。 IoT Edge 裝置位於第一層,作為父系。 另一個IoT Edge裝置位於第二層,同時作為子系和父系。 最後,IoT 裝置位於第三層,作為最低層子裝置。

產生憑證

憑證鏈結必須安裝在相同網關階層中的裝置上,才能建立本身之間的安全通訊。 階層中的每個裝置,無論是IoT Edge裝置還是IoT下游裝置,都需要相同根 CA 憑證的複本。 階層中的每個IoT Edge裝置接著都會使用該根 CA 憑證作為其裝置 CA 憑證的根目錄。

透過此設定,每個下游 IoT Edge 裝置都可以驗證其父系的身分識別,方法是確認 其連線的 edgeHub 具有共用根 CA 憑證所簽署的伺服器證書。

網關和下游裝置上根 CA 簽發的憑證鏈結圖例

如需IoT Edge 憑證需求的詳細資訊,請參閱 瞭解 Azure IoT Edge 如何使用憑證

  1. 建立或要求下列憑證:

    • CA 憑證,這是指定閘道階層中所有裝置的最上層共用憑證。 此憑證會安裝在所有裝置上。
    • 您想要包含在跟證書鏈結中的任何中繼憑證
    • 裝置 CA 憑證及其私鑰,由跟證書和中繼憑證產生。 您需要閘道階層中每個 IoT Edge 裝置的唯一裝置 CA 憑證。

    您可以使用自我簽署的證書頒發機構單位,或從 Baltimore、Verisign、Digicert 或 GlobalSign 等受信任商業證書頒發機構單位購買。

  2. 如果您沒有用於測試的憑證,請建立一組跟證書和中繼憑證,然後為每個裝置建立IoT Edge裝置 CA 憑證。 在本文中,我們將針對範例和教學課程使用使用測試 CA 憑證所產生的測試憑證。 例如,下列命令會建立根 CA 憑證、父裝置憑證和子裝置憑證。

    # !!! For test only - do not use in production !!!
    
    # Create the the root CA test certificate
    ./certGen.sh create_root_and_intermediate
    
    # Create the parent (gateway) device test certificate 
    # signed by the shared root CA certificate
    ./certGen.sh create_edge_device_ca_certificate "gateway"
    
    # Create the downstream device test certificate
    # signed by the shared root CA certificate
    ./certGen.sh create_edge_device_ca_certificate "downstream"
    

    警告

    請勿使用測試腳本為生產環境建立的憑證。 它們包含硬式編碼的密碼,且預設會在 30 天后到期。 測試 CA 憑證是針對示範用途提供的,可協助您瞭解 CA 憑證。 使用您自己的安全性最佳做法,在生產環境中建立認證和存留期管理。

    如需建立測試憑證的詳細資訊,請參閱 建立示範憑證以測試 IoT Edge 裝置功能

  3. 您必須將憑證和金鑰傳輸至每個裝置。 您可以使用 USB 磁碟驅動器、Azure 金鑰保存庫 等服務,或搭配安全檔案複製等函式。 選擇最符合您案例的其中一種方法。 將檔案複製到憑證和金鑰的慣用目錄。 用於 /var/aziot/certs 憑證和 /var/aziot/secrets 金鑰。

如需在裝置上安裝憑證的詳細資訊,請參閱 管理 IoT Edge 裝置上的憑證。

設定父裝置

若要設定父裝置,請開啟本機或遠端命令殼層。

若要啟用安全連線,網關案例中的每個IoT Edge父裝置都必須使用唯一的裝置CA憑證和閘道階層中所有裝置共用的根 CA 憑證複本進行設定。

  1. 檢查您的憑證是否符合 格式需求

  2. 根 CA 憑證父裝置 CA 憑證父私鑰 傳輸至父裝置。

  3. 將憑證和金鑰複製到正確的目錄。 裝置憑證的慣用目錄適用於 /var/aziot/certs 憑證和 /var/aziot/secrets 金鑰。

    ### Copy device certificate ###
    
    # If the device certificate and keys directories don't exist, create, set ownership, and set permissions
    sudo mkdir -p /var/aziot/certs
    sudo chown aziotcs:aziotcs /var/aziot/certs
    sudo chmod 755 /var/aziot/certs
    
    sudo mkdir -p /var/aziot/secrets
    sudo chown aziotks:aziotks /var/aziot/secrets
    sudo chmod 700 /var/aziot/secrets
    
    # Copy full-chain device certificate and private key into the correct directory
    sudo cp iot-edge-device-ca-gateway-full-chain.cert.pem /var/aziot/certs
    sudo cp iot-edge-device-ca-gateway.key.pem /var/aziot/secrets
    
    ### Root certificate ###
    
    # Copy root certificate into the /certs directory
    sudo cp azure-iot-test-only.root.ca.cert.pem /var/aziot/certs
    
    # Copy root certificate into the CA certificate directory and add .crt extension.
    # The root certificate must be in the CA certificate directory to install it in the certificate store.
    # Use the appropriate copy command for your device OS or if using EFLOW.
    
    # For Ubuntu and Debian, use /usr/local/share/ca-certificates/
    sudo cp azure-iot-test-only.root.ca.cert.pem /usr/local/share/azure-iot-test-only.root.ca.cert.pem.crt
    # For EFLOW, use /etc/pki/ca-trust/source/anchors/
    sudo cp azure-iot-test-only.root.ca.cert.pem /etc/pki/ca-trust/source/anchors/azure-iot-test-only.root.ca.pem.crt
    
  4. 變更憑證和金鑰的擁有權和許可權。

    # Give aziotcs ownership to certificates
    # Read and write for aziotcs, read-only for others
    sudo chown -R aziotcs:aziotcs /var/aziot/certs
    sudo find /var/aziot/certs -type f -name "*.*" -exec chmod 644 {} \;
    
    # Give aziotks ownership to private keys
    # Read and write for aziotks, no permission for others
    sudo chown -R aziotks:aziotks /var/aziot/secrets
    sudo find /var/aziot/secrets -type f -name "*.*" -exec chmod 600 {} \;
    
    # Verify permissions of directories and files
    sudo ls -Rla /var/aziot
    

    具有正確擁有權和權限的清單輸出如下所示:

    azureUser@vm:/var/aziot$ sudo ls -Rla /var/aziot
    /var/aziot:
    total 16
    drwxr-xr-x  4 root    root    4096 Dec 14 00:16 .
    drwxr-xr-x 15 root    root    4096 Dec 14 00:15 ..
    drwxr-xr-x  2 aziotcs aziotcs 4096 Jan 14 00:31 certs
    drwx------  2 aziotks aziotks 4096 Jan 23 17:23 secrets
    
    /var/aziot/certs:
    total 20
    drwxr-xr-x 2 aziotcs aziotcs 4096 Jan 14 00:31 .
    drwxr-xr-x 4 root    root    4096 Dec 14 00:16 ..
    -rw-r--r-- 1 aziotcs aziotcs 1984 Jan 14 00:24 azure-iot-test-only.root.ca.cert.pem
    -rw-r--r-- 1 aziotcs aziotcs 5887 Jan 14 00:27 iot-edge-device-ca-gateway-full-chain.cert.pem
    
    /var/aziot/secrets:
    total 16
    drwx------ 2 aziotks aziotks 4096 Jan 23 17:23 .
    drwxr-xr-x 4 root    root    4096 Dec 14 00:16 ..
    -rw------- 1 aziotks aziotks 3243 Jan 14 00:28 iot-edge-device-ca-gateway.key.pem
    
  5. 使用平臺特定命令更新裝置上的證書存儲,以在父 IoT Edge 裝置上安裝根 CA 憑證

    # Update the certificate store
    
    # For Ubuntu or Debian - use update-ca-certificates
    sudo update-ca-certificates
    # For EFLOW or RHEL - use update-ca-trust
    sudo update-ca-trust
    

    如需在 EFLOW 中使用 update-ca-trust 的詳細資訊,請參閱 CBL-Mariner SSL CA 憑證管理

命令會報告已將一個憑證新增至 /etc/ssl/certs

Updating certificates in /etc/ssl/certs...
1 added, 0 removed; done.

更新父組態檔

您應該已在裝置上安裝IoT Edge。 如果沒有,請遵循手動布建單一 Linux IoT Edge 裝置的步驟

  1. 確認組 /etc/aziot/config.toml 態檔存在於父裝置上。

    如果您的裝置上沒有組態檔,請使用下列命令,根據範本檔案建立設定檔:

    sudo cp /etc/aziot/config.toml.edge.template /etc/aziot/config.toml
    

    您也可以使用範本檔案作為在本節中新增組態參數的參考。

  2. 使用編輯器開啟IoT Edge組態檔。 例如,使用 nano 編輯器開啟 /etc/aziot/config.toml 檔案。

    sudo nano /etc/aziot/config.toml
    
  3. 尋找主機名參數,或將其新增至組態檔的開頭。 將值更新為完整功能變數名稱 (FQDN) 或 IoT Edge 父裝置的 IP 位址。 例如:

    hostname = "10.0.0.4"
    

    若要啟用閘道探索,每個IoT Edge閘道 (父代) 裝置都必須指定主機名參數,其子裝置將用來在局域網路上尋找它。 每個下游 IoT Edge 裝置都必須指定 parent_hostname 參數來識別其父系。 在單一 IoT Edge 裝置同時為父裝置和子裝置的階層式案例中,它需要這兩個參數。

    主機名trust_bundle_cert參數必須位於組態檔的開頭,才能有任何區段。 在定義的區段之前新增 參數,以確保其已正確套用。

    使用小於 64 個字元的主機名,這是伺服器證書一般名稱的字元限制。

    與閘道階層中的主機名模式一致。 使用 FQDN 或 IP 位址,但不要同時使用兩者。 連線下游裝置需要 FQDN 或 IP 位址。

    在建立edgeHub容器之前設定主機名。 如果 edgeHub 正在執行,在重新建立容器之前,變更組態檔中的主機名將不會生效。 如需如何驗證主機名套用的詳細資訊,請參閱 驗證父組態 一節。

  4. 尋找信任套件組合憑證參數,或將其新增至組態檔的開頭。

    trust_bundle_cert 參數更新為裝置上根 CA 憑證的檔案 URI。 例如:

    trust_bundle_cert = "file:///var/aziot/certs/azure-iot-test-only.root.ca.cert.pem"
    
  5. 尋找或新增 組態檔中的Edge CA 憑證 區段。 使用父 IoT Edge 裝置上完整鏈結憑證和金鑰檔案的檔案 URI 路徑來更新憑證 cert 和私鑰 pk 參數。 IoT Edge 需要憑證和私鑰以文字為基礎的隱私權增強郵件 (PEM) 格式。 例如:

    [edge_ca]
    cert = "file:///var/aziot/certs/iot-edge-device-ca-gateway-full-chain.cert.pem"
    pk = "file:///var/aziot/secrets/iot-edge-device-ca-gateway.key.pem"
    
  6. 確認 IoT Edge 裝置在啟動時會使用正確的 IoT Edge 代理程式版本。 尋找 [ 預設 Edge 代理程式 ] 區段,並將 IoT Edge 的映射值設定為 1.5 版。 例如:

    [agent.config]
    image = "mcr.microsoft.com/azureiotedge-agent:1.5"
    
  7. 父組態檔的開頭看起來應該類似下列範例。

    hostname = "10.0.0.4"
    trust_bundle_cert = "file:///var/aziot/certs/azure-iot-test-only.root.ca.cert.pem"
    
    [edge_ca]
    cert = "file:///var/aziot/certs/iot-edge-device-ca-gateway-full-chain.cert.pem"
    pk = "file:///var/aziot/secrets/iot-edge-device-ca-gateway.key.pem"
    
  8. 儲存並關閉 config.toml 組態檔。 例如,如果您使用 nano 編輯器,請選取 Ctrl+O - 寫出EnterCtrl+X - Exit。

  9. 如果您之前已針對 IoT Edge 使用任何其他憑證,請刪除下列兩個目錄中的檔案,以確定已套用新的憑證:

    • /var/lib/aziot/certd/certs
    • /var/lib/aziot/keyd/keys
  10. 套用您的變更。

    sudo iotedge config apply
    
  11. 檢查組態中是否有任何錯誤。

    sudo iotedge check --verbose
    

    注意

    在新布建的裝置上,您可能會看到與 IoT Edge 中樞相關的錯誤:

    ×生產整備:Edge Hub 的記憶體目錄會保存在主機文件系統上 - 錯誤

    無法檢查edgeHub容器的目前狀態

    新布建的裝置上預期會發生此錯誤,因為IoT Edge中樞模組未執行。 若要解決錯誤,請在 IoT 中樞 中設定裝置的模組並建立部署。 為裝置建立部署會啟動裝置上的模組,包括IoT Edge中樞模組。

確認父組態

主機名必須是限定功能變數名稱 (FQDN) 或 IoT Edge 裝置的 IP 位址,因為下游裝置連線時,IoT Edge 會在伺服器證書中使用此值。 這些值必須相符,否則您會收到 IP位址不符 錯誤。

若要驗證主機名,您必須檢查edgeHub容器的環境變數。

  1. 列出執行中的IoT Edge容器。

    iotedge list
    

    確認 edgeAgentedgeHub 容器正在執行。 命令輸出應該類似下列範例。

    NAME                        STATUS           DESCRIPTION      CONFIG
    SimulatedTemperatureSensor  running          Up 5 seconds     mcr.microsoft.com/azureiotedge-simulated-temperature-sensor:1.0
    edgeAgent                   running          Up 17 seconds    mcr.microsoft.com/azureiotedge-agent:1.5
    edgeHub                     running          Up 6 seconds     mcr.microsoft.com/azureiotedge-hub:1.5
    
  2. 檢查edgeHub容器。

    sudo docker inspect edgeHub
    
  3. 在輸出中,尋找 Env 區段中的 EdgeDeviceHostName 參數。

    "EdgeDeviceHostName=10.0.0.4"
    
  4. 確認 EdgeDeviceHostName 參數值符合config.toml主機名設定。 如果不符合,當您修改並套用組態時, edgeHub 容器正在執行。 若要更新 EdgeDeviceHostName,請移除 edgeAgent 容器。

    sudo docker rm -f edgeAgent
    

    edgeAgentedgeHub容器會在幾分鐘內重新建立並啟動。 執行edgeHub容器之後,請檢查容器,並確認EdgeDeviceHostName 參數符合組態檔。

設定下游裝置

若要設定下游裝置,請開啟本機或遠端命令殼層。

若要啟用安全連線,網關案例中的每個IoT Edge下游裝置都必須使用唯一的裝置CA憑證和閘道階層中所有裝置共用的根 CA 憑證複本進行設定。

  1. 檢查您的憑證是否符合 格式需求

  2. 根 CA 憑證子裝置 CA 憑證子私鑰 傳輸至下游裝置。

  3. 將憑證和金鑰複製到正確的目錄。 裝置憑證的慣用目錄適用於 /var/aziot/certs 憑證和 /var/aziot/secrets 金鑰。

    ### Copy device certificate ###
    
    # If the device certificate and keys directories don't exist, create, set ownership, and set permissions
    sudo mkdir -p /var/aziot/certs
    sudo chown aziotcs:aziotcs /var/aziot/certs
    sudo chmod 755 /var/aziot/certs
    
    sudo mkdir -p /var/aziot/secrets
    sudo chown aziotks:aziotks /var/aziot/secrets
    sudo chmod 700 /var/aziot/secrets
    
    # Copy device full-chain certificate and private key into the correct directory
    sudo cp iot-device-downstream-full-chain.cert.pem /var/aziot/certs
    sudo cp iot-device-downstream.key.pem /var/aziot/secrets
    
    ### Root certificate ###
    
    # Copy root certificate into the /certs directory
    sudo cp azure-iot-test-only.root.ca.cert.pem /var/aziot/certs
    
    # Copy root certificate into the CA certificate directory and add .crt extension.
    # The root certificate must be in the CA certificate directory to install it in the certificate store.
    # Use the appropriate copy command for your device OS or if using EFLOW.
    
    # For Ubuntu and Debian, use /usr/local/share/ca-certificates/
    sudo cp azure-iot-test-only.root.ca.cert.pem /usr/local/share/azure-iot-test-only.root.ca.cert.pem.crt
    # For EFLOW, use /etc/pki/ca-trust/source/anchors/
    sudo cp azure-iot-test-only.root.ca.cert.pem /etc/pki/ca-trust/source/anchors/azure-iot-test-only.root.ca.pem.crt
    
  4. 變更憑證和金鑰的擁有權和許可權。

    # Give aziotcs ownership to certificates
    # Read and write for aziotcs, read-only for others
    sudo chown -R aziotcs:aziotcs /var/aziot/certs
    sudo find /var/aziot/certs -type f -name "*.*" -exec chmod 644 {} \;
    
    # Give aziotks ownership to private keys
    # Read and write for aziotks, no permission for others
    sudo chown -R aziotks:aziotks /var/aziot/secrets
    sudo find /var/aziot/secrets -type f -name "*.*" -exec chmod 600 {} \;
    
  5. 使用平臺特定命令更新裝置上的證書存儲,在下游 IoT Edge 裝置上安裝根 CA 憑證

    # Update the certificate store
    
    # For Ubuntu or Debian - use update-ca-certificates
    sudo update-ca-certificates
    # For EFLOW or RHEL - use update-ca-trust
    sudo update-ca-trust
    

    如需在 EFLOW 中使用 update-ca-trust 的詳細資訊,請參閱 CBL-Mariner SSL CA 憑證管理

命令會報告已將一個憑證新增至 /etc/ssl/certs

Updating certificates in /etc/ssl/certs...
1 added, 0 removed; done.

更新下游組態檔

您應該已在裝置上安裝IoT Edge。 如果沒有,請遵循手動布建單一 Linux IoT Edge 裝置的步驟

  1. /etc/aziot/config.toml確認組態檔存在於下游裝置上。

    如果您的裝置上沒有組態檔,請使用下列命令,根據範本檔案建立設定檔:

    sudo cp /etc/aziot/config.toml.edge.template /etc/aziot/config.toml
    

    您也可以使用範本檔案作為在本節中新增組態參數的參考。

  2. 使用編輯器開啟IoT Edge組態檔。 例如,使用 nano 編輯器開啟 /etc/aziot/config.toml 檔案。

    sudo nano /etc/aziot/config.toml
    
  3. 尋找parent_hostname參數,或將其新增至組態檔的開頭:每個下游 IoT Edge 裝置都必須指定parent_hostname參數來識別其父系。 parent_hostname將 參數更新為父裝置的 FQDN 或 IP 位址,比對父裝置組態檔中提供的主機名。 例如:

    parent_hostname = "10.0.0.4"
    
  4. 尋找信任套件組合憑證參數,或將其新增至組態檔的開頭。

    trust_bundle_cert 參數更新為裝置上根 CA 憑證的檔案 URI。 例如:

    trust_bundle_cert = "file:///var/aziot/certs/azure-iot-test-only.root.ca.cert.pem"
    
  5. 在組態檔中尋找或新增 Edge CA 憑證 區段。 使用 IoT Edge 下游裝置上完整鏈結憑證和金鑰檔案的檔案 URI 路徑來更新憑證 cert 和私鑰 pk 參數。 IoT Edge 需要憑證和私鑰以文字為基礎的隱私權增強郵件 (PEM) 格式。 例如:

    [edge_ca]
    cert = "file:///var/aziot/certs/iot-device-downstream-full-chain.cert.pem"
    pk = "file:///var/aziot/secrets/iot-device-downstream.key.pem"
    
  6. 確認 IoT Edge 裝置在啟動時會使用正確的 IoT Edge 代理程式版本。 尋找 [ 預設 Edge 代理程式 ] 區段,並將 IoT Edge 的映射值設定為 1.5 版。 例如:

    [agent.config]
    image: "mcr.microsoft.com/azureiotedge-agent:1.5"
    
  7. 下游組態檔的開頭看起來應該類似下列範例。

    parent_hostname = "10.0.0.4"
    trust_bundle_cert = "file:///var/aziot/certs/azure-iot-test-only.root.ca.cert.pem"
    
    [edge_ca]
    cert = "file:///var/aziot/certs/iot-device-downstream-full-chain.cert.pem"
    pk = "file:///var/aziot/secrets/iot-device-downstream.key.pem"
    
  8. 儲存並關閉 config.toml 組態檔。 例如,如果您使用 nano 編輯器,請選取 Ctrl+O - 寫出EnterCtrl+X - Exit。

  9. 如果您之前已針對 IoT Edge 使用任何其他憑證,請刪除下列兩個目錄中的檔案,以確定已套用新的憑證:

    • /var/lib/aziot/certd/certs
    • /var/lib/aziot/keyd/keys
  10. 套用您的變更。

    sudo iotedge config apply
    
  11. 檢查組態中是否有任何錯誤。

    sudo iotedge check --verbose
    

    提示

    IoT Edge 檢查工具會使用容器來執行一些診斷檢查。 如果您想要在下游 IoT Edge 裝置上使用此工具,請確定它們可以存取 mcr.microsoft.com/azureiotedge-diagnostics:latest,或在您的私人容器登錄中擁有容器映像。

    注意

    在新布建的裝置上,您可能會看到與 IoT Edge 中樞相關的錯誤:

    ×生產整備:Edge Hub 的記憶體目錄會保存在主機文件系統上 - 錯誤

    無法檢查edgeHub容器的目前狀態

    新布建的裝置上預期會發生此錯誤,因為IoT Edge中樞模組未執行。 若要解決錯誤,請在 IoT 中樞 中設定裝置的模組並建立部署。 為裝置建立部署會啟動裝置上的模組,包括IoT Edge中樞模組。

網路隔離下游裝置

本文到目前為止的步驟會將IoT Edge裝置設定為閘道或下游裝置,並在兩者之間建立受信任的連線。 網關裝置會處理下游裝置與 IoT 中樞 之間的互動,包括驗證和訊息路由。 部署到下游 IoT Edge 裝置的模組仍然可以建立自己的雲端服務連線。

某些網路架構,例如遵循 ISA-95 標準的網路架構,會尋求將因特網連線數目降到最低。 在這些案例中,您可以設定下游 IoT Edge 裝置,而不需要直接因特網連線。 除了透過閘道裝置路由傳送 IoT 中樞 通訊之外,下游IoT Edge裝置可以依賴閘道裝置來進行所有雲端連線。

此網路設定要求閘道階層最上層的 IoT Edge 裝置只能直接連線到雲端。 較低層中的IoT Edge裝置只能與其父裝置或任何子裝置通訊。 閘道裝置上的特殊模組可啟用此案例,包括:

  • 任何 IoT Edge 閘道上都需要 API Proxy 模組,其下方有另一個 IoT Edge 裝置。 這表示它必須位於網關階層的每一層但底層除外。 本課程模組會使用 nginx 反向 Proxy,透過單一埠透過網路層路由傳送 HTTP 資料。 它可透過其模組對應項和環境變數進行高度設定,因此可以調整以符合您的網關案例需求。

  • Docker 登錄模組可以部署在閘道階層最上層的IoT Edge閘道上。 本課程模組負責代表較低層中的所有IoT Edge裝置擷取和快取容器映像。 在最上層部署此模組的替代方法是使用本機登錄,或手動將容器映像載入裝置,並將模組提取原則設定為 永不

  • IoT Edge 上的 Azure Blob 儲存體 可以部署在閘道階層最上層的 IoT Edge 閘道上。 本課程模組負責代表較低層中的所有IoT Edge裝置上傳 Blob。 上傳 Blob 的功能也會為較低層中的 IoT Edge 裝置啟用實用的疑難解答功能,例如模組記錄上傳和支援套件組合上傳。

網路組態

針對最上層的每個閘道裝置,網路操作員必須:

  • 提供靜態 IP 位址或完整功能變數名稱 (FQDN)。

  • 透過埠 443 (HTTPS) 和 5671 (AMQP) 授權從此 IP 位址到您 Azure IoT 中樞 主機名的輸出通訊。

  • 授權透過埠 443 (HTTPS) 從此 IP 位址到 Azure Container Registry 主機名的輸出通訊。

    API Proxy 模組一次只能處理一個容器登錄的連線。 建議您擁有所有容器映像,包括儲存在私人容器登錄中的 Microsoft Container Registry (mcr.microsoft.com) 所提供的公用映像。

針對較低層中的每個閘道裝置,網路操作員必須:

  • 提供靜態IP位址。
  • 透過埠 443(HTTPS) 和 5671(AMQP),授權從此 IP 位址到父閘道 IP 位址的輸出通訊。

將模組部署至最上層裝置

網關階層最上層的IoT Edge裝置除了您可以在裝置上執行的任何工作負載模組之外,還必須部署一組必要的模組。

API Proxy 模組的設計目的是要自定義以處理最常見的閘道案例。 本文提供在基本組態中設定模組的範例。 如需 詳細資訊和範例,請參閱設定網關階層案例 的 API Proxy 模組。

  1. Azure 入口網站中,瀏覽至您的 IoT 中樞。

  2. 選取 [裝置管理] 功能表下的 [裝置]。

  3. 從清單中選取您要設定的最上層 IoT Edge 裝置。

  4. 選取 [設定模組]

  5. 在 [ IoT Edge 模組] 區段中,選取 [ 新增 ],然後選擇 [ Marketplace 模組]。

  6. 搜尋並選取 IoT Edge API Proxy 模組。

  7. 從已部署的模組清單中選取 API Proxy 模組的名稱,並更新下列模組設定:

    1. 在 [環境變數] 索引標籤中,將 NGINX_DEFAULT_PORT 的值更新為 443

    2. 在 [ 容器建立選項 ] 索引卷標中,更新埠系結以參考埠 443。

      {
        "HostConfig": {
          "PortBindings": {
            "443/tcp": [
              {
                "HostPort": "443"
              }
            ]
          }
        }
      }
      

    這些變更會將 API Proxy 模組設定為接聽埠 443。 若要防止埠系結衝突,您必須將edgeHub模組設定為不要接聽埠 443。 相反地,API Proxy 模組會在埠 443 上路由傳送任何edgeHub流量。

  8. 選取 [運行時間 設定,然後尋找 edgeHub 模組建立選項。 刪除埠 443 的埠系結,保留埠 5671 和 8883 的系結。

    {
      "HostConfig": {
        "PortBindings": {
          "5671/tcp": [
            {
              "HostPort": "5671"
            }
          ],
          "8883/tcp": [
            {
              "HostPort": "8883"
            }
          ]
        }
      }
    }
    
  9. 選取 [ 儲存 ] 以將變更儲存至運行時間設定。

  10. 再次選取 [ 新增 ],然後選擇 [ IoT Edge 模組]。

  11. 提供下列值,以將 Docker 登錄模組新增至您的部署:

    1. IoT Edge 模組名稱registry

    2. 在 [模組設定] 索引標籤上影像 URIregistry:latest

    3. 在 [ 環境變數] 索引標籤上,新增下列環境變數:

      • 名稱REGISTRY_PROXY_REMOTEURL:您想要此登錄模塊對應之容器登錄的 URL。 例如: https://myregistry.azurecr

        登錄模組只能對應至一個容器登錄,因此我們建議在單一私人容器登錄中擁有所有容器映像。

      • 名稱:值REGISTRY_PROXY_USERNAME要向容器登錄進行驗證的用戶名稱。

      • 名稱:值REGISTRY_PROXY_PASSWORD要向容器登錄進行驗證的密碼。

    4. 在 [ 容器建立選項] 索引 標籤上,貼上:

      {
          "HostConfig": {
              "PortBindings": {
                  "5000/tcp": [
                      {
                          "HostPort": "5000"
                      }
                  ]
              }
          }
      }
      
  12. 選取 [新增 ] 以將模組新增至部署。

  13. 選取 [下一步:路由 ] 以移至下一個步驟。

  14. 若要讓來自下游裝置的裝置到雲端訊息到達 IoT 中樞,請包含將所有訊息傳遞至 IoT 中樞 的路由。 例如:

    1. 名稱Route
    2. FROM /messages/* INTO $upstream
  15. 選取 [ 檢閱 + 建立 ] 以移至最後一個步驟。

  16. 選取 [建立] 以部署至您的裝置。

將模組部署至較低層裝置

除了您可以在裝置上執行的任何工作負載模組之外,網關階層較低層的 IoT Edge 裝置還有一個必要模組必須部署至它們。

路由容器映像提取

在討論閘道階層中 IoT Edge 裝置所需的 Proxy 模組之前,請務必瞭解較低層中的 IoT Edge 裝置如何取得其模組映像。

如果您的較低層裝置無法連線到雲端,但您想要它們像往常一樣提取模組映像,則必須設定網關階層的頂層裝置來處理這些要求。 最上層裝置必須執行對應至容器登錄的 Docker 登錄 模組。 然後,設定 API Proxy 模組,以將容器要求路由傳送至該模組。 本文先前各節將討論這些詳細數據。 在此設定中,較低層裝置不應該指向雲端容器登錄,而是指向在最上層執行的登錄。

例如,較低層裝置應該呼叫 ,而不是呼叫 mcr.microsoft.com/azureiotedge-api-proxy:1.1$upstream:443/azureiotedge-api-proxy:1.1

$upstream參數指向較低層裝置的父代,因此要求會路由傳送到所有層,直到到達具有 Proxy 環境路由容器要求至登錄模組的最上層為止。 :443此範例中的埠應該取代為父裝置上 API Proxy 模組正在接聽的埠。

API Proxy 模組只能路由傳送至一個登錄模組,而每個登錄模組只能對應至一個容器登錄。 因此,下層裝置需要提取的任何映射都必須儲存在單一容器登錄中。

如果您不想讓較低層裝置透過閘道階層提出模組提取要求,另一個選項是管理本機登錄解決方案。 或者,先將模組映像推送到裝置,再建立部署,然後將 imagePullPolicy 設定永不

啟動IoT Edge代理程式

IoT Edge 代理程式是在任何 IoT Edge 裝置上啟動的第一個運行時間元件。 您必須確定任何下游 IoT Edge 裝置在啟動時都可以存取 edgeAgent 模組映像,然後他們可以存取部署,並啟動其餘模組映像。

當您進入IoT Edge裝置上的組態檔以提供其驗證資訊、憑證和父主機名時,也會更新edgeAgent容器映像。

如果最上層網關裝置設定為處理容器映像要求,請將 取代 mcr.microsoft.com 為父主機名和 API Proxy 接聽埠。 在部署指令清單中,您可以使用 $upstream 做為快捷方式,但需要edgeHub模組來處理路由,且該模組目前尚未啟動。 例如:

[agent]
name = "edgeAgent"
type = "docker"

[agent.config]
image: "{Parent FQDN or IP}:443/azureiotedge-agent:1.5"

如果您使用本機容器登錄,或手動在裝置上提供容器映像,請據以更新配置檔。

設定運行時間並部署 Proxy 模組

需要 API Proxy 模組,才能路由傳送雲端與任何下游 IoT Edge 裝置之間的所有通訊。 階層底層的IoT Edge裝置不需要此模組,且沒有下游IoT Edge裝置。

API Proxy 模組的設計目的是要自定義以處理最常見的閘道案例。 本文簡短說明在基本組態中設定模組的步驟。 如需 詳細資訊和範例,請參閱設定網關階層案例 的 API Proxy 模組。

  1. Azure 入口網站中,瀏覽至您的 IoT 中樞。

  2. 選取 [裝置管理] 功能表下的 [裝置]。

  3. 從清單中選取您要設定的較低層 IoT Edge 裝置。

  4. 選取 [設定模組]

  5. 在 [ IoT Edge 模組] 區段中,選取 [ 新增 ],然後選擇 [ Marketplace 模組]。

  6. 搜尋並選取 IoT Edge API Proxy 模組。

  7. 從已部署的模組清單中選取 API Proxy 模組的名稱,並更新下列模組設定:

    1. 在 [模組設定] 索引標籤中,更新影像 URI 的值。 把 mcr.microsoft.com 替換為 $upstream:443

    2. 在 [環境變數] 索引標籤中,將 NGINX_DEFAULT_PORT 的值更新為 443

    3. 在 [ 容器建立選項 ] 索引卷標中,更新埠系結以參考埠 443。

      {
        "HostConfig": {
          "PortBindings": {
            "443/tcp": [
              {
                "HostPort": "443"
              }
            ]
          }
        }
      }
      

    這些變更會將 API Proxy 模組設定為接聽埠 443。 若要防止埠系結衝突,您必須將edgeHub模組設定為不要接聽埠 443。 相反地,API Proxy 模組會在埠 443 上路由傳送任何edgeHub流量。

  8. 選取 [執行階段設定]

  9. 更新 edgeHub 模組設定:

    1. 在 [ 影像] 欄位中,將 取代 mcr.microsoft.com$upstream:443
    2. 在 [ 建立選項 ] 欄位中,刪除埠 443 的埠系結,保留埠 5671 和 8883 的系結。
    {
      "HostConfig": {
        "PortBindings": {
          "5671/tcp": [
            {
              "HostPort": "5671"
            }
          ],
          "8883/tcp": [
            {
              "HostPort": "8883"
            }
          ]
        }
      }
    }
    
  10. 更新 edgeAgent 模組設定:

    1. 在 [ 影像] 欄位中,將 取代 mcr.microsoft.com$upstream:443
  11. 選取 [ 儲存 ] 以將變更儲存至運行時間設定。

  12. 選取 [下一步:路由 ] 以移至下一個步驟。

  13. 若要讓來自下游裝置的裝置到雲端訊息到達 IoT 中樞,請包含將所有訊息傳遞至 $upstream的路由。 上游參數會指向較低層裝置的父裝置。 例如:

    1. 名稱Route
    2. FROM /messages/* INTO $upstream
  14. 選取 [ 檢閱 + 建立 ] 以移至最後一個步驟。

  15. 選取 [建立] 以部署至您的裝置。

確認從子系到父系的連線能力

  1. 在下游裝置上執行下列 openssl 命令,確認從子系到父系的 TLS/SSL 連線。 將取代 <parent hostname> 為父系的 FQDN 或 IP 位址。

    openssl s_client -connect <parent hostname>:8883 </dev/null 2>&1 >/dev/null
    

    命令應該判斷提示父憑證鏈結的成功驗證,類似下列範例:

    azureUser@child-vm:~$ openssl s_client -connect <parent hostname>:8883 </dev/null 2>&1 >/dev/null
    Can't use SSL_get_servername
    depth=3 CN = Azure_IoT_Hub_CA_Cert_Test_Only
    verify return:1
    depth=2 CN = Azure_IoT_Hub_Intermediate_Cert_Test_Only
    verify return:1
    depth=1 CN = gateway.ca
    verify return:1
    depth=0 CN = <parent hostname>
    verify return:1
    DONE
    

    您可以忽略「無法使用SSL_get_servername」訊息。

    此值depth=0 CN = 應該符合config.toml組態檔中指定的主機名參數。

    如果命令逾時,子裝置與父裝置之間可能會封鎖埠。 檢閱裝置的網路組態和設定。

    警告

    在閘道區 [edge_ca] 段中不使用完整鏈結憑證會導致來自下游裝置的憑證驗證錯誤。 例如, openssl s_client ... 上述命令會產生:

    Can't use SSL_get_servername
    depth=1 CN = gateway.ca
    verify error:num=20:unable to get local issuer certificate
    verify return:1
    depth=0 CN = <parent hostname>
    verify return:1
    DONE
    

    如果下游裝置上未使用並設定完整鏈結裝置憑證,則連線到下游 IoT Edge 裝置的 TLS 裝置會發生相同的問題。

整合適用於IoT的 Microsoft Defender 與IoT Edge閘道

下游裝置可用來使用下游裝置 Proxy 將適用於IoT的 Microsoft Defender 微代理程式與IoT Edge閘道整合。

深入瞭解 適用於IoT的Defender微代理程式

若要使用下游裝置 Proxy 將適用於 IoT 的 Microsoft Defender 與 IoT Edge 整合:

  1. 登入 Azure 入口網站。

  2. 流覽至 [IoT 中樞Your Hub>>][裝置管理>裝置]

  3. 選取您的裝置。

    螢幕快照,顯示裝置的選取位置。

  4. DefenderIotMicroAgent選取您從這些指示建立的模組對應項。

    顯示 DefenderIotMicroAgent 位置的螢幕快照。

  5. 選取按鈕以複製您的 連線 字串(主鍵)。

  6. 將 連線 字串貼到文字編輯應用程式中,並將 GatewayHostName 新增至字串。 例如: HostName=nested11.azure-devices.net;DeviceId=downstream1;ModuleId=module1;SharedAccessKey=xxx;GatewayHostName=10.16.7.4

  7. 在下游裝置上開啟終端機。

  8. 使用下列命令,將 適用於雲端的 Defender 代理程式目錄中 utf-8 編碼的 連接字串 放入下列路徑中的 檔案connection_string.txt/etc/defender_iot_micro_agent/connection_string.txt

    sudo bash -c 'echo "<connection string>" > /etc/defender_iot_micro_agent/connection_string.txt'
    

    connection_string.txt現在應該位於下列路徑位置/etc/defender_iot_micro_agent/connection_string.txt

  9. 使用此命令重新啟動服務:

    sudo systemctl restart defender-iot-micro-agent.service 
    
  10. 流覽回裝置。

    顯示如何巡覽回裝置的螢幕快照。

  11. 啟用 IoT 中樞 的連線,然後選取齒輪圖示。

    顯示要選取以設定父裝置的項目螢幕快照。

  12. 從顯示的清單中選取父裝置。

  13. 確定下游裝置與IoT Edge裝置之間的埠8883 (MQTT) 已開啟。

下一步

如何使用 IoT Edge 裝置作為閘道

設定閘道階層案例的 API Proxy 模組