共用方式為


將 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 Edge 裝置的階層

建立閘道階層

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

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

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

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

在 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 中樞服務 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 Key Vault 之類的服務,或使用安全檔案複製等功能。 選擇最符合您案例的其中一種方法。 將檔案複製到憑證和金鑰的慣用目錄。 將 /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. 尋找 hostname 參數,或將其新增至組態檔的開頭。 將值更新為 IoT Edge 父裝置的完整網域名稱 (FQDN) 或 IP 位址。 例如:

    hostname = "10.0.0.4"
    

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

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

    使用少於 64 個字元的主機名稱,這是伺服器憑證通用名稱的字元限制。

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

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

  4. 尋找 Trust bundle cert 參數,或將其新增至組態檔的開頭。

    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]
    name = "edgeAgent"
    type = "docker"
    
    [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 - 寫出,接著按 Enter,然後使用 Ctrl+X - 離開

  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 中樞模組。

確認父設定

hostname 必須是完整網域名稱 (FQDN) 或 IoT Edge 裝置的 IP 位址,因為下游裝置連線時,IoT Edge 會在伺服器憑證中使用此值。 這些值必須相符,否則您會收到 IP 位址不相符錯誤。

若要確認 hostname,您必須檢查 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.tomlhostname 設定。 如果不符合,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 參數,或將其新增至組態檔的開頭。

    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]
    name = "edgeAgent"
    type = "docker"
    
    [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 - 寫出,接著按 Enter,然後使用 Ctrl+X - 離開

  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 裝置的 IoT Edge 閘道上都需要 API Proxy 模組。 這表示其必須位於閘道階層的每一層,但底層除外。 本課程模組會使用 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. 在 [模組設定] 索引標籤上的 [影像 URI]registry: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 模組,以將容器要求路由傳送至該模組。 本文先前各節將討論這些詳細資料。 在此設定中,較低層的裝置不應指向雲端容器登錄,而是指向在最上層執行的登錄。

例如,下層裝置應呼叫 $upstream:443/azureiotedge-api-proxy:1.1,而非呼叫 mcr.microsoft.com/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. 若要啟用下游裝置中裝置到雲端的訊息以觸達 $upstream,請包含將所有訊息傳遞至 IoT 中樞的路由。 上游參數會在較低層裝置的情況下指向父裝置。 例如:

    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 組態檔中指定的 hostname 參數。

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

    警告

    在閘道的 [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 新增至字串。 GatewayHostName 是父裝置的完整域名或IP位址。 例如: 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 模組