Azure IoT Edge 디바이스를 함께 연결하여 계층 구조 만들기
적용 대상: IoT Edge 1.5 IoT Edge 1.4
Important
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 Hub에 직접 연결되는 디바이스는 최상위 계층에 있는 것으로 간주합니다. 이 디바이스는 모든 하위 디바이스의 요청을 처리합니다. 두 번째 구성은 계층 구조의 하위 계층에 있는 모든 IoT Edge 디바이스에 해당합니다. 이러한 디바이스는 다른 다운스트림 IoT 및 IoT Edge 디바이스를 위한 게이트웨이의 역할을 맡을 수 있지만 여전히 해당 부모 디바이스를 통해 통신을 라우팅해야 합니다.
일부 네트워크 아키텍처에서는 계층 구조의 상위 IoT Edge 디바이스만 클라우드에 연결할 수 있습니다. 이 구성에서 계층 구조의 하위 계층에 있는 모든 IoT Edge 디바이스는 자신의 게이트웨이(부모) 디바이스 및 다운스트림(자식) 디바이스와만 통신할 수 있습니다.
이 문서의 모든 단계는 IoT Edge 디바이스를 투명 게이트웨이로 작동하도록 구성을 기반으로 합니다. 여기서는 IoT Edge 디바이스를 다운스트림 IoT 디바이스의 게이트웨이로 설정합니다. 모든 게이트웨이 시나리오에는 다음과 같은 동일한 기본 단계가 적용됩니다.
- 인증: 게이트웨이 계층 구조의 모든 디바이스에 대한 IoT Hub ID를 만듭니다.
- 권한 부여: IoT Hub에서 부모/자식 관계를 설정하여 IoT Hub에 연결하는 것과 같이 관련 부모 디바이스에 연결할 수 있는 다운스트림 디바이스에 권한을 부여합니다.
- 게이트웨이 검색: 다운스트림 디바이스가 로컬 네트워크에서 해당 부모 디바이스를 찾을 수 있는지 확인합니다.
- 보안 연결: 동일한 체인에 포함된 신뢰할 수 있는 인증서를 사용하여 보안 연결을 설정합니다.
필수 조건
- 무료 또는 표준 IoT Hub.
- 최상위 계층 디바이스 한 개 및 하위 계층 디바이스 한 개 이상을 포함하는 두 개 이상의 IoT Edge 디바이스. IoT Edge 디바이스를 사용할 수 없는 경우 Ubuntu 가상 머신에서 Azure IoT Edge를 실행할 수 있습니다.
- Azure CLI를 사용하여 디바이스를 만들고 관리하는 경우 Azure IoT 확장을 설치합니다.
팁
이 문서에서는 시나리오에 적합한 게이트웨이 계층 구조를 만드는 데 도움이 되는 자세한 단계와 옵션을 제공합니다. 단계별 자습서는 게이트웨이를 사용하여 IoT Edge 디바이스의 계층 구조 만들기를 참조하세요.
게이트웨이 계층 구조 만들기
시나리오에서 IoT Edge 디바이스에 대한 부모/자식 관계를 정의하여 IoT Edge 게이트웨이 계층 구조를 만듭니다. 새 디바이스 ID를 만들 때 부모 디바이스를 설정하거나 기존 디바이스 ID의 부모 및 자식 관계를 관리할 수 있습니다.
부모/자식 관계를 설정하는 단계는 다운스트림 디바이스가 IoT Hub에 연결하는 것과 같이 부모 디바이스에 연결할 수 있도록 권한을 부여합니다.
IoT Edge 디바이스만 부모 디바이스가 될 수 있지만 IoT Edge 디바이스 및 IoT 디바이스는 모두 자식 디바이스가 될 수 있습니다. 부모는 여러 자식을 가지지만 자식은 한 부모만을 가질 수 있는 것과 같습니다. 게이트웨이 계층 구조는 하나의 디바이스의 자식이 다른 디바이스의 부모가 되도록 부모/자식 집합을 함께 연결하여 생성됩니다.
기본적으로 부모에는 최대 100개의 자식이 있을 수 있습니다. 부모 디바이스의 edgeHub 모듈에서 MaxConnectedClients 환경 변수를 설정하여 이 제한을 변경할 수 있습니다.
Azure Portal에서 새 디바이스 ID를 만들 때, 또는 기존 디바이스를 편집하여 부모/자식 관계를 관리할 수 있습니다.
새 IoT Edge 디바이스를 만들 때 해당 허브의 기존 IoT Edge 디바이스 목록에서 부모 및 자식 디바이스를 선택하는 옵션이 있습니다.
- Azure Portal에서 IoT Hub로 이동합니다.
- 장치 관리 메뉴 아래에서 디바이스를 선택합니다.
- 디바이스 추가를 선택한 다음 IoT Edge 디바이스 확인란을 선택합니다.
- 디바이스 ID 및 인증 설정과 함께 부모 디바이스를 설정하거나 자식 디바이스를 선택할 수 있습니다.
- 부모 또는 자식으로 사용할 디바이스를 하나 이상 선택합니다.
기존 디바이스에 대한 부모/자식 관계를 만들거나 관리할 수도 있습니다.
- Azure Portal에서 IoT Hub로 이동합니다.
- 디바이스 관리 메뉴 아래에서 디바이스를 선택합니다.
- 목록에서 IoT Edge 디바이스 관리하려는 디바이스를 선택합니다.
- 부모 디바이스 설정 기어 아이콘 또는 자식 디바이스 관리를 선택합니다.
- 부모 또는 자식 디바이스를 추가하거나 제거합니다.
참고 항목
프로그래밍 방식으로 상위-하위 관계를 설정하려는 경우 C#, Java 또는 Node.js IoT Hub 서비스 SDK를 사용할 수 있습니다.
다음은 C# SDK를 사용하여 자식 디바이스를 할당하는 예입니다. RegistryManager_AddAndRemoveDeviceWithScope()
작업은 프로그래밍 방식으로 3-계층 구조를 작성하는 방법을 보여 줍니다. IoT Edge 디바이스는 부모로 계층 1에 있습니다. 또 다른 IoT Edge 디바이스는 계층 2에 있으며 자식 및 부모 역할을 합니다. 마지막으로, IoT 디바이스는 가장 낮은 계층 자식 디바이스로 계층 3에 있습니다.
인증서 생성
동일한 게이트웨이 계층 구조의 여러 디바이스 전반에 일관된 인증서 체인을 설치하여 디바이스 사이의 보안 통신을 구축해야 합니다. IoT Edge 디바이스 또는 IoT 다운스트림 디바이스와 관계없이 계층 구조의 모든 디바이스에는 동일한 루트 CA 인증서의 복사본이 필요합니다. 계층 구조의 각 IoT Edge 디바이스는 해당 루트 CA 인증서를 Edge CA 인증서의 루트로 사용합니다.
이 설정을 사용하면 각 다운스트림 IoT Edge 디바이스가 연결된 edgeHub에 공유 루트 CA 인증서로 서명된 서버 인증서가 있는지 확인하여 부모 ID를 확인할 수 있습니다.
IoT Edge 인증 요구 사항에 대한 자세한 내용은 Azure IoT Edge에서 인증서를 사용하는 방법 이해를 참조하세요.
다음 인증서를 만들거나 요청합니다.
- 지정된 게이트웨이 계층 구조의 모든 디바이스에 대한 최상위 공유 인증서인 루트 CA 인증서입니다. 이 인증서는 모든 디바이스에 설치됩니다.
- 루트 인증서 체인에 포함하려는 중간 인증서입니다.
- 루트 및 중간 인증서에서 생성된 Edge CA 인증서 및 해당 프라이빗 키입니다. 게이트웨이 계층 구조의 각 IoT Edge 디바이스에 대해 하나의 고유한 Edge CA 인증서가 필요합니다.
자체 서명된 인증 기관을 사용하거나 신뢰할 수 있는 상업적 인증 기관(예: Baltimore, Verisign, Digicert 또는 GlobalSign)에서 구매할 수 있습니다.
테스트에 사용할 고유한 인증서가 없는 경우 루트 및 중간 인증서 집합을 만든 다음 각 디바이스에 대한 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"
Warning
프로덕션용 테스트 스크립트에서 만든 인증서를 사용하지 마세요. 하드 코딩된 암호가 포함되며 기본값으로 30일 후에 만료됩니다. 테스트 CA 인증서는 CA 인증서를 이해하는 데 도움이 되는 데모용으로 제공됩니다. 프로덕션 환경에서는 인증서 만들기 및 수명 관리를 위한 자체 보안 모범 사례를 사용하세요.
테스트 인증서를 만드는 방법에 대한 자세한 내용은 데모 인증서를 만들어 IoT Edge 디바이스 기능 테스트를 참조하세요.
인증서와 키를 각 디바이스로 전송해야 합니다. USB 드라이브, Azure Key Vault와 같은 서비스 또는 보안 파일 복사본과 같은 기능을 사용할 수 있습니다. 시나리오와 가장 일치하는 방법 중 하나를 선택합니다. 인증서 및 키에 대한 기본 설정 디렉터리에 파일을 복사합니다. 인증서에는
/var/aziot/certs
를 사용하고 키에는/var/aziot/secrets
를 사용합니다.
디바이스에 인증서를 설치하는 방법에 대한 자세한 내용은IoT Edge 디바이스에서 인증서 관리를 참조하세요.
부모 디바이스 구성
부모 디바이스를 구성하려면 로컬 또는 원격 명령 셸을 엽니다.
보안 연결을 사용하려면 게이트웨이 시나리오의 모든 IoT Edge 부모 디바이스를 고유한 Edge CA 인증서 및 게이트웨이 계층 구조의 모든 디바이스에서 공유하는 루트 CA 인증서의 복사본으로 구성해야 합니다.
인증서가 형식 요구 사항을 충족하는지 확인합니다.
루트 CA 인증서, 부모 Edge CA 인증서 및 부모 프라이빗 키를 부모 디바이스로 전송합니다.
인증서 및 키를 올바른 디렉터리에 복사합니다. 디바이스 인증서에 대한 기본 설정 디렉터리로는 인증서의 경우
/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
인증서 및 키의 소유권 및 권한을 변경합니다.
# 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
플랫폼별 명령을 사용하여 디바이스의 인증서 저장소를 업데이트하여 부모 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 디바이스를 수동으로 프로비저닝합니다.
/etc/aziot/config.toml
구성 파일이 부모 디바이스에 있는지 확인합니다.구성 파일이 디바이스에 존재하지 않는 경우 다음 명령을 사용하여 템플릿 파일을 기준으로 구성 파일을 만듭니다.
sudo cp /etc/aziot/config.toml.edge.template /etc/aziot/config.toml
템플릿 파일을 참조로 사용하여 이 섹션에서 구성 매개 변수를 추가할 수도 있습니다.
편집기를 사용하여 IoT Edge 구성 파일을 엽니다. 예를 들어
nano
편집기를 사용하여/etc/aziot/config.toml
파일을 엽니다.sudo nano /etc/aziot/config.toml
hostname 매개 변수를 찾거나 이를 구성 파일의 시작 부분에 추가합니다. 값을 부모 IoT Edge 디바이스의 FQDN(정규화된 도메인 이름) 또는 IP 주소로 업데이트합니다. 예시:
hostname = "10.0.0.4"
게이트웨이 검색을 사용하도록 설정하려면 모든 IoT Edge 게이트웨이(부모) 디바이스는 자식 디바이스가 로컬 네트워크에서 찾을 때 사용할 hostname 매개 변수를 지정해야 합니다. 모든 다운스트림 IoT Edge 디바이스는 부모를 식별하기 위한 parent_hostname 매개 변수를 지정해야 합니다. 단일 IoT Edge 디바이스가 부모 및 자식 디바이스 둘 다인 계층 구조 시나리오에서는 두 매개 변수가 모두 필요합니다.
hostname 및 trust_bundle_cert 매개 변수는 섹션 앞에 구성 파일의 시작 부분에 있어야 합니다. 정의된 섹션 앞에 매개 변수를 추가할 때 매개 변수가 올바르게 적용되었는지 확인합니다.
서버 인증서 일반 이름의 문자 제한으로 호스트 이름은 64자 이내여야 합니다.
게이트웨이 계층 구조 전체에서 호스트 이름 패턴이 일관되어야 합니다. FQDN 또는 IP 주소 중 하나만 사용합니다. 다운스트림 디바이스에 연결하려면 FQDN 또는 IP 주소가 필요합니다.
edgeHub 컨테이너를 만들기 전에 호스트 이름을 설정합니다. edgeHub가 실행 중인 경우 컨테이너가 다시 만들어질 때까지 구성 파일의 호스트 이름 변경이 적용되지 않습니다. 호스트 이름이 적용되었는지 확인하는 방법에 대한 자세한 내용은 부모 구성 확인 섹션을 참조하세요.
Trust bundle cert 매개 변수를 찾거나 이를 구성 파일의 시작 부분에 추가합니다.
디바이스에서 루트 CA 인증서에 대한 파일 URI를 사용하여
trust_bundle_cert
매개 변수를 업데이트합니다. 예시:trust_bundle_cert = "file:///var/aziot/certs/azure-iot-test-only.root.ca.cert.pem"
구성 파일에서 Edge CA 인증서 섹션을 찾거나 추가합니다. 인증서
cert
및 프라이빗 키pk
매개 변수를 부모 IoT Edge 디바이스의 전체 체인 인증서 및 키 파일에 대한 파일 URI 경로로 업데이트합니다. IoT Edge에서는 인증서 및 프라이빗 키가 텍스트 기반 PEM(Privacy Enhanced Mail) 형식이어야 합니다. 예시:[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"
IoT Edge 디바이스가 시작될 때 올바른 버전의 IoT Edge 에이전트를 사용하는지 확인합니다. 기본 Edge 에이전트 섹션을 찾아 이미지 값을 IoT Edge 버전 1.5로 설정합니다. 예시:
[agent] name = "edgeAgent" type = "docker" [agent.config] image = "mcr.microsoft.com/azureiotedge-agent:1.5"
부모 구성 파일의 시작은 다음 예제와 유사합니다.
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"
config.toml
구성 파일을 저장하고 닫습니다. 예를 들어 nano 편집기를 사용하는 경우 Ctrl+O - 쓰기 출력(Write Out), Enter 및 Ctrl+X - 나가기(Exit)를 선택합니다.이전에 IoT Edge에 다른 인증서를 사용한 경우 다음 두 디렉터리의 파일을 삭제하여 새 인증서가 적용되었는지 확인합니다.
/var/lib/aziot/certd/certs
/var/lib/aziot/keyd/keys
변경 사항을 적용합니다.
sudo iotedge config apply
구성에서 오류를 확인합니다.
sudo iotedge check --verbose
참고 항목
새로 프로비전된 디바이스에서 IoT Edge Hub와 관련된 오류가 표시될 수 있습니다.
× 프로덕션 준비: Edge Hub의 스토리지 디렉터리가 호스트 파일 시스템에 유지되고 있습니다. - 오류
edgeHub 컨테이너의 현재 상태를 확인할 수 없습니다.
IoT Edge Hub 모듈이 실행되고 있지 않으므로 새로 프로비저닝된 디바이스에서 이 오류가 예상됩니다. 오류를 해결하려면 IoT Hub에서 디바이스에 대한 모듈을 설정하고 배포를 만듭니다. 디바이스에 대한 배포를 만들면 IoT Edge Hub 모듈을 포함하여 디바이스에서 모듈이 시작됩니다.
부모 구성 확인
hostname은 IoT Edge 다운스트림 디바이스가 연결될 때 서버 인증서에서 이 값을 사용하므로 FQDN(정규화된 도메인 이름) 또는 IoT Edge 디바이스의 IP 주소여야 합니다. 값이 일치하지 않으면 IP 주소 불일치 오류가 발생합니다.
hostname을 확인하려면 edgeHub 컨테이너의 환경 변수를 검사해야 합니다.
실행 중인 IoT Edge 컨테이너를 나열합니다.
iotedge list
edgeAgent 및 edgeHub 컨테이너가 실행 중인지 확인합니다. 명령 출력은 다음 예와 유사해야 합니다.
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
edgeHub 컨테이너를 검사합니다.
sudo docker inspect edgeHub
출력의 Env 섹션에서 EdgeDeviceHostName 매개 변수를 찾습니다.
"EdgeDeviceHostName=10.0.0.4"
EdgeDeviceHostName 매개 변수 값이
config.toml
hostname 설정과 일치하는지 확인합니다. 일치하지 않는 경우 구성을 수정하고 적용할 때 edgeHub 컨테이너가 실행 중이었던 것입니다. EdgeDeviceHostName을 업데이트하려면 edgeAgent 컨테이너를 제거합니다.sudo docker rm -f edgeAgent
edgeAgent 및 edgeHub 컨테이너는 몇 분 내에 다시 만들어지고 시작됩니다. edgeHub 컨테이너가 실행되면 컨테이너를 검사하고 EdgeDeviceHostName 매개 변수가 구성 파일과 일치하는지 확인합니다.
다운스트림 디바이스 구성
다운스트림 디바이스를 구성하려면 로컬 또는 원격 명령 셸을 엽니다.
보안 연결을 사용하도록 설정하려면 게이트웨이 시나리오의 모든 IoT Edge 다운스트림 디바이스를 고유한 Edge CA 인증서 및 게이트웨이 계층 구조의 모든 디바이스에서 공유하는 루트 CA 인증서의 복사본으로 구성해야 합니다.
인증서가 형식 요구 사항을 충족하는지 확인합니다.
루트 CA 인증서, 자식 Edge CA 인증서 및 자식 프라이빗 키를 다운스트림 디바이스로 전송합니다.
인증서 및 키를 올바른 디렉터리에 복사합니다. 디바이스 인증서에 대한 기본 설정 디렉터리로는 인증서의 경우
/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
인증서 및 키의 소유권 및 권한을 변경합니다.
# 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 {} \;
플랫폼별 명령을 사용하여 디바이스의 인증서 저장소를 업데이트하여 다운스트림 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 디바이스를 수동으로 프로비저닝합니다.
/etc/aziot/config.toml
구성 파일이 다운스트림 디바이스에 있는지 확인합니다.구성 파일이 디바이스에 존재하지 않는 경우 다음 명령을 사용하여 템플릿 파일을 기준으로 구성 파일을 만듭니다.
sudo cp /etc/aziot/config.toml.edge.template /etc/aziot/config.toml
템플릿 파일을 참조로 사용하여 이 섹션에서 구성 매개 변수를 추가할 수도 있습니다.
편집기를 사용하여 IoT Edge 구성 파일을 엽니다. 예를 들어
nano
편집기를 사용하여/etc/aziot/config.toml
파일을 엽니다.sudo nano /etc/aziot/config.toml
parent_hostname 매개 변수를 찾거나 이를 구성 파일의 시작 부분에 추가합니다. 모든 다운스트림 IoT Edge 디바이스는 부모를 식별하기 위한 parent_hostname 매개 변수를 지정해야 합니다. 부모 디바이스의
parent_hostname
구성 파일에서 호스트 이름으로 제공된 것과 일치하는 것과 부모 디바이스의 FQDN 또는 IP 주소가 되도록 매개 변수를 업데이트합니다. 예시:parent_hostname = "10.0.0.4"
Trust bundle cert 매개 변수를 찾거나 이를 구성 파일의 시작 부분에 추가합니다.
디바이스에서 루트 CA 인증서에 대한 파일 URI를 사용하여
trust_bundle_cert
매개 변수를 업데이트합니다. 예시:trust_bundle_cert = "file:///var/aziot/certs/azure-iot-test-only.root.ca.cert.pem"
구성 파일에서 에지 CA 인증서 섹션을 찾거나 추가합니다. 인증서
cert
및 프라이빗 키pk
매개 변수를 IoT Edge 다운스트림 디바이스의 인증서 및 키 파일에 대한 파일 URI 경로로 업데이트합니다. IoT Edge에서는 인증서 및 프라이빗 키가 텍스트 기반 PEM(Privacy Enhanced Mail) 형식이어야 합니다. 예시:[edge_ca] cert = "file:///var/aziot/certs/iot-device-downstream-full-chain.cert.pem" pk = "file:///var/aziot/secrets/iot-device-downstream.key.pem"
IoT Edge 디바이스가 시작될 때 올바른 버전의 IoT Edge 에이전트를 사용하는지 확인합니다. 기본 Edge 에이전트 섹션을 찾아 이미지 값을 IoT Edge 버전 1.5로 설정합니다. 예시:
[agent] name = "edgeAgent" type = "docker" [agent.config] image: "mcr.microsoft.com/azureiotedge-agent:1.5"
다운스트림 구성 파일의 시작은 다음 예제와 유사합니다.
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"
config.toml
구성 파일을 저장하고 닫습니다. 예를 들어 nano 편집기를 사용하는 경우 Ctrl+O - 쓰기 출력(Write Out), Enter 및 Ctrl+X - 나가기(Exit)를 선택합니다.이전에 IoT Edge에 다른 인증서를 사용한 경우 다음 두 디렉터리의 파일을 삭제하여 새 인증서가 적용되었는지 확인합니다.
/var/lib/aziot/certd/certs
/var/lib/aziot/keyd/keys
변경 사항을 적용합니다.
sudo iotedge config apply
구성에서 오류를 확인합니다.
sudo iotedge check --verbose
팁
IoT Edge 검사 도구는 컨테이너를 사용하여 일부 진단 검사를 수행합니다. 다운스트림 IoT Edge 디바이스에서 이 도구를 사용하려면,
mcr.microsoft.com/azureiotedge-diagnostics:latest
에 엑세스하거나 또는 개인 컨테이너 레지스트리에 컨테이너 이미지를 포함할 수 있는지 확인합니다.참고 항목
새로 프로비전된 디바이스에서 IoT Edge Hub와 관련된 오류가 표시될 수 있습니다.
× 프로덕션 준비: Edge Hub의 스토리지 디렉터리가 호스트 파일 시스템에 유지되고 있습니다. - 오류
edgeHub 컨테이너의 현재 상태를 확인할 수 없습니다.
IoT Edge Hub 모듈이 실행되고 있지 않으므로 새로 프로비저닝된 디바이스에서 이 오류가 예상됩니다. 오류를 해결하려면 IoT Hub에서 디바이스에 대한 모듈을 설정하고 배포를 만듭니다. 디바이스에 대한 배포를 만들면 IoT Edge Hub 모듈을 포함하여 디바이스에서 모듈이 시작됩니다.
네트워크 분리 다운스트림 디바이스
이 문서에서 지금까지의 단계는 게이트웨이 또는 다운스트림 디바이스로 IoT Edge 디바이스를 설정하고 둘 사이에 신뢰할 수 있는 연결을 만듭니다. 게이트웨이 디바이스는 인증 및 메시지 라우팅을 비롯하여 다운스트림 디바이스와 IoT Hub 간의 상호 작용을 처리합니다. 다운스트림 IoT Edge 디바이스에 배포된 모듈은 클라우드 서비스에 대한 자체 연결을 만들 수 있습니다.
ISA-95 표준을 따르는 것과 같은 일부 네트워크 아키텍처는 인터넷 연결 수를 최소화하는 것을 추구합니다. 이러한 시나리오에서는 직접 인터넷에 연결하지 않고도 다운스트림 IoT Edge 디바이스를 구성할 수 있습니다. 게이트웨이 디바이스를 통한 라우팅 IoT Hub 통신 외에도 다운스트림 IoT Edge 디바이스는 모든 클라우드 연결에 대해 게이트웨이 디바이스를 사용할 수 있습니다.
이 네트워크 구성에서는 게이트웨이 계층 구조의 최상위 계층에 있는 IoT Edge 디바이스만 클라우드에 직접 연결되어야 합니다. 하위 계층의 IoT Edge 디바이스는 관련 부모 디바이스 또는 자식 디바이스와만 통신할 수 있습니다. 게이트웨이 디바이스의 특수 모듈을 사용하여 다음을 포함한 이 시나리오를 사용할 수 있습니다.
API 프록시 모듈은 하위에 다른 IoT Edge 디바이스가 있는 모든 IoT Edge 게이트웨이에 필수입니다. 즉, 가장 하위 계층을 제외하고 게이트웨이 계층 구조의 모든 계층에 필요합니다. 이 모듈에서는 nginx 역방향 프록시를 사용하여 단일 포트에 네트워크 계층을 통해 HTTP 데이터를 라우팅합니다. 모듈 쌍 및 환경 변수를 통해 구성 가능하므로 게이트웨이 시나리오 요구 사항에 맞게 조정할 수 있습니다.
Docker 레지스트리 모듈은 게이트웨이 계층 구조의 최상위 계층의 IoT Edge 게이트웨이에 배포할 수 있습니다. 이 모듈은 하위 계층에서 모든 IoT Edge 디바이스를 대신하여 컨테이너 이미지를 검색하고 캐싱합니다. 최상위 계층에 이 모듈을 배포하는 대신 로컬 레지스트리를 사용하거나 컨테이너 이미지를 디바이스에 수동으로 로드하고 모듈 풀 정책을 절대 사용하지 않음으로 설정합니다.
IoT Edge에서 Azure Blob Storage는 게이트웨이 계층 구조의 최상위 계층에 있는 IoT Edge 게이트웨이에 배포할 수 있습니다. 이 모듈은 하위 계층에 있는 모든 IoT Edge 디바이스를 대신하여 Blob을 업로드합니다. Blob을 업로드하는 기능을 사용하면 모듈 로그 업로드 및 지원 번들 업로드와 같이 하위 계층에서 IoT Edge 디바이스에 유용한 문제 해결 기능을 사용할 수도 있습니다.
네트워크 구성
최상위 계층의 각 게이트웨이 디바이스에 대해 네트워크 운영자는 다음을 수행해야 합니다.
고정 IP 주소 또는 FQDN(정규화된 도메인 이름)을 제공합니다.
포트 443(HTTPS) 및 5671(AMQP)을 통해 이 IP 주소에서 Azure IoT Hub 호스트 이름으로 아웃바운드 통신 권한을 부여합니다.
포트 443(HTTPS)을 통해 이 IP 주소에서 Azure Container Registry 호스트 이름으로 아웃바운드 통신 권한을 부여합니다.
API 프록시 모듈은 한 번에 하나의 컨테이너 레지스트리에 대한 연결만 처리할 수 있습니다. Microsoft Container Registry(mcr.microsoft.com)에서 제공하는 퍼블릭 이미지를 포함하여 모든 컨테이너 이미지를 개인 컨테이너 레지스트리에 저장하는 것이 좋습니다.
하위 계층의 각 게이트웨이 디바이스에 대해 네트워크 운영자는 다음을 수행해야 합니다.
- 고정 IP 주소 제공
- 포트 443(HTTPS) 및 5671(AMQP)을 통해 이 IP 주소에서 부모 게이트웨이의 IP 주소로의 아웃바운드 통신 권한을 부여합니다.
최상위 계층 디바이스에 모듈 배포
게이트웨이 계층 구조의 최상위 계층에 있는 IoT Edge 디바이스에는 디바이스에서 실행할 수 있는 워크로드 모듈 외에도 배포해야 하는 필수 모듈 집합이 있습니다.
API 프록시 모듈은 대부분의 일반 게이트웨이 시나리오를 처리하기 위해 사용자 지정할 수 있도록 설계되었습니다. 이 문서에서는 기본 구성에서 모듈을 설정하는 방법과 예제를 제공합니다. 자세한 내용 및 예제는 게이트웨이 계층 구조 시나리오에 대한 API 프록시 모듈 구성을 참조하세요.
Azure Portal에서 IoT Hub로 이동합니다.
장치 관리 메뉴 아래에서 디바이스를 선택합니다.
목록에서 구성 중인 최상위 계층 IoT Edge 디바이스를 선택합니다.
모듈 설정을 선택합니다.
IoT Edge 모듈 섹션에서 추가를 선택한 다음 IoT Edge 모듈을 선택합니다.
다음 모듈 설정을 업데이트합니다.
설정 값 IoT 모듈 이름 IoTEdgeAPIProxy
이미지 URI mcr.microsoft.com/azureiotedge-api-proxy:latest
정책 다시 시작 항상 원하는 상태 실행 중 API 프록시 모듈의 다른 버전이나 아키텍처를 사용하려면 Microsoft 아티팩트 레지스트리에서 사용 가능한 이미지를 찾습니다.
환경 변수 탭에서 값이
443
인 텍스트 형식의NGINX_DEFAULT_PORT
라는 변수를 추가합니다.컨테이너 만들기 옵션 탭에서 포트 443을 참조하도록 포트 바인딩을 업데이트합니다.
{ "HostConfig": { "PortBindings": { "443/tcp": [ { "HostPort": "443" } ] } } }
이러한 변경은 API 프록시 모듈이 포트 443에서 수신 대기하도록 구성합니다. 포트 바인딩 충돌을 방지하려면 edgeHub 모듈이 포트 443에서 수신 대기하지 않도록 구성해야 합니다. 대신, API 프록시 모듈은 포트 443에서 모든 edgeHub 트래픽을 라우팅합니다.
추가를 선택하여 모듈을 배포에 추가합니다.
런타임 설정을 선택하고 edgeHub 모듈 컨테이너 만들기 옵션을 찾습니다. 포트 5671 및 8883에 대한 바인딩을 그대로 두고 포트 443에 대한 포트 바인딩을 삭제합니다.
{ "HostConfig": { "PortBindings": { "5671/tcp": [ { "HostPort": "5671" } ], "8883/tcp": [ { "HostPort": "8883" } ] } } }
런타임 설정에 대한 변경 내용을 저장하려면 적용을 선택합니다.
배포에 Docker 레지스트리 모듈을 추가하려면 다음 값을 입력합니다.
IoT Edge 모듈 섹션에서 추가를 선택한 다음 IoT Edge 모듈을 선택합니다.
설정 값 IoT 모듈 이름 registry
이미지 URI registry:latest
다시 시작 정책 always
원하는 상태 running
환경 변수 탭에서 다음 변수를 추가합니다.
속성 타입 값 REGISTRY_PROXY_REMOTEURL
Text 이 레지스트리 모듈을 매핑할 컨테이너 레지스트리의 URL입니다. 예들 들어 https://myregistry.azurecr
입니다. 레지스트리 모듈은 하나의 컨테이너 레지스트리에만 매핑할 수 있으므로 모든 컨테이너 이미지를 단일 프라이빗 컨테이너 레지스트리에 포함하는 것이 좋습니다.REGISTRY_PROXY_USERNAME
Text 컨테이너 레지스트리에 인증하기 위한 사용자 이름입니다. REGISTRY_PROXY_PASSWORD
Text 컨테이너 레지스트리에 인증하기 위한 암호입니다. 컨테이너 만들기 옵션 탭에서 포트 5000을 참조하도록 포트 바인딩을 업데이트합니다.
{ "HostConfig": { "PortBindings": { "5000/tcp": [ { "HostPort": "5000" } ] } } }
추가를 선택하여 모듈을 배포에 추가합니다.
다음을 선택: 다음 단계로 이동하기 위한 경로입니다.
다운스트림 디바이스에서 IoT Hub에 도달하기 위해 디바이스-클라우드 메시지를 사용하도록 설정하려면 모든 메시지를 IoT Hub에 전달하는 경로를 포함합니다. 예시:
- 이름:
Route
- 값:
FROM /messages/* INTO $upstream
- 이름:
검토 + 만들기를 선택하여 마지막 단계로 이동합니다.
만들기를 선택하여 디바이스에 배포합니다.
하위 계층 디바이스에 모듈 배포
게이트웨이 계층 구조의 하위 계층에 있는 IoT Edge 디바이스에는 디바이스에서 실행하는 워크로드 모듈 외에도 배포해야 하는 필수 모듈이 하나 있습니다.
컨테이너 이미지 풀 라우팅
게이트웨이 계층 구조의 IoT Edge 디바이스에 필요한 프록시 모듈에 관해 설명하기 전에 하위 계층의 IoT Edge 디바이스가 관련 모듈 이미지를 가져오는 방법을 이해해야 합니다.
하위 계층 디바이스를 클라우드에 연결할 수 없지만, 평소처럼 모듈 이미지를 풀하려면 게이트웨이 계층 구조의 최상위 계층 디바이스가 이러한 요청을 처리하도록 구성해야 합니다. 최상위 계층 디바이스는 컨테이너 레지스트리에 매핑되는 Docker 레지스트리 모듈을 실행해야 합니다. 그런 다음 컨테이너 요청을 라우팅하도록 API 프록시 모듈을 구성합니다. 이에 관한 세부 정보는 이 문서의 이전 섹션에서 참고하세요. 이 구성에서 하위 계층 디바이스는 클라우드 컨테이너 레지스트리가 아닌 최상위 계층에서 실행되는 레지스트리를 가리켜야 합니다.
예를 들어 mcr.microsoft.com/azureiotedge-api-proxy:1.1
를 호출하는 대신 하위 계층 디바이스는 $upstream:443/azureiotedge-api-proxy:1.1
를 호출해야 합니다.
$upstream 매개 변수는 하위 계층 디바이스의 부모 디바이스를 가리키며 요청은 레지스트리 모듈에 컨테이너 요청을 라우팅하는 프록시 환경을 포함하는 최상위 계층에 도달할 때까지 모든 계층에 걸쳐 라우팅합니다. 이 예제의 :443
포트는 부모 디바이스의 API 프록시 모듈이 수신 대기 중인 포트로 대체되어야 합니다.
API 프록시 모듈은 하나의 레지스트리 모듈에만 라우팅할 수 있으며 각 레지스트리 모듈은 하나의 컨테이너 레지스트리에만 매핑할 수 있습니다. 따라서 하위 계층 디바이스가 풀하는 이미지는 단일 컨테이너 레지스트리에 저장되어야 합니다.
하위 계층 디바이스가 게이트웨이 계층 구조를 통해 모듈 풀 요청을 수행하지 않도록 하려는 경우 또 다른 옵션은 로컬 레지스트리 솔루션을 관리하는 것입니다. 또는 배포를 만들기 전에 모듈 이미지를 디바이스에 푸시한 다음 imagePullPolicy를 절대 사용하지 않음으로 설정합니다.
IoT Edge 에이전트 부트스트랩
IoT Edge 에이전트는 모든 IoT Edge 디바이스에서 처음으로 시작되는 런타임 구성 요소로, 다운스트림 IoT Edge 디바이스가 시작될 때 edgeAgent module 이미지에 액세스할 수 있어야 다음 배포에 액세스하고 나머지 모듈 이미지를 시작할 수 있습니다.
IoT Edge 디바이스의 구성 파일로 이동하여 해당 인증 정보, 인증서 및 부모 호스트 이름을 입력하려면 edgeAgent 컨테이너 이미지도 업데이트합니다.
최상위 게이트웨이 디바이스가 컨테이너 이미지 요청을 처리하도록 구성된 경우 mcr.microsoft.com
을 부모 호스트 이름 및 API 프록시 수신 대기 포트로 바꿉니다. 배포 매니페스트에서는 $upstream
를 바로 가기로 사용할 수 있지만 이 경우 edgeHub 모듈이 라우팅을 처리해야 하는데, 해당 모듈은 이 시점에서 시작되지 않았습니다. 예시:
[agent]
name = "edgeAgent"
type = "docker"
[agent.config]
image: "{Parent FQDN or IP}:443/azureiotedge-agent:1.5"
로컬 컨테이너 레지스트리를 사용하거나 디바이스에서 수동으로 컨테이너 이미지를 제공하는 경우 구성 파일을 적절하게 업데이트합니다.
런타임 구성 및 프록시 모듈 배포
API 프록시 모듈은 클라우드와 모든 다운스트림 IoT Edge 디바이스 간의 모든 통신을 라우팅하는 데 필요합니다. 다운스트림 IoT Edge 디바이스가 없는 계층의 최하위 계층의 IoT Edge 디바이스에는 이 모듈이 필요하지 않습니다.
API 프록시 모듈은 대부분의 일반 게이트웨이 시나리오를 처리하기 위해 사용자 지정할 수 있도록 설계되었습니다. 이 문서에서는 기본 구성에서 모듈을 설정하는 단계에 관해 간략하게 설명합니다. 자세한 내용 및 예제는 게이트웨이 계층 구조 시나리오에 대한 API 프록시 모듈 구성을 참조하세요.
Azure Portal에서 IoT Hub로 이동합니다.
장치 관리 메뉴 아래에서 디바이스를 선택합니다.
목록에서 구성 중인 하위 계층 IoT Edge 디바이스를 선택합니다.
모듈 설정을 선택합니다.
IoT Edge 모듈 섹션에서 추가를 선택한 다음 IoT Edge 모듈을 선택합니다.
다음 모듈 설정을 업데이트합니다.
설정 값 IoT 모듈 이름 IoTEdgeAPIProxy
이미지 URI mcr.microsoft.com/azureiotedge-api-proxy:latest
다시 시작 정책 always
원하는 상태 running
API 프록시 모듈의 다른 버전이나 아키텍처를 사용하려면 Microsoft 아티팩트 레지스트리에서 사용 가능한 이미지를 찾습니다.
환경 변수 탭에서 값이
443
인 텍스트 형식의NGINX_DEFAULT_PORT
라는 변수를 추가합니다.컨테이너 만들기 옵션 탭에서 포트 443을 참조하도록 포트 바인딩을 업데이트합니다.
{ "HostConfig": { "PortBindings": { "443/tcp": [ { "HostPort": "443" } ] } } }
이러한 변경은 API 프록시 모듈이 포트 443에서 수신 대기하도록 구성합니다. 포트 바인딩 충돌을 방지하려면 edgeHub 모듈이 포트 443에서 수신 대기하지 않도록 구성해야 합니다. 대신, API 프록시 모듈은 포트 443에서 모든 edgeHub 트래픽을 라우팅합니다.
런타임 설정을 선택합니다.
EdgeHub 모듈 설정을 업데이트합니다.
- 이미지 필드에서
mcr.microsoft.com
을$upstream:443
로 바꿉니다. - 만들기 옵션 필드에서 포트 5671 및 8883에 대한 바인딩을 그대로 두고 포트 443에 대한 포트 바인딩을 삭제합니다.
{ "HostConfig": { "PortBindings": { "5671/tcp": [ { "HostPort": "5671" } ], "8883/tcp": [ { "HostPort": "8883" } ] } } }
- 이미지 필드에서
EdgeAgent 모듈 설정을 업데이트합니다.
- 이미지 필드에서
mcr.microsoft.com
을$upstream:443
로 바꿉니다.
- 이미지 필드에서
런타임 설정에 대한 변경 내용을 저장하려면 적용을 선택합니다.
다음을 선택: 다음 단계로 이동하기 위한 경로입니다.
다운스트림 디바이스에서 IoT Hub에 도달하기 위해 디바이스와 클라우드 간 메시지를 사용하도록 설정하려면 모든 메시지를
$upstream
에 전달하는 경로를 포함합니다. 하위 계층 디바이스의 경우 업스트림 매개 변수는 부모 디바이스를 가리킵니다. 예시:- 이름:
Route
- 값:
FROM /messages/* INTO $upstream
- 이름:
검토 + 만들기를 선택하여 마지막 단계로 이동합니다.
만들기를 선택하여 디바이스에 배포합니다.
자식에서 부모로의 연결 확인
다운스트림 디바이스에서 다음
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
구성 파일에 지정된 호스트 이름 매개 변수와 일치해야 합니다.명령 시간이 초과되면 자식 디바이스와 부모 디바이스 간의 차단된 포트가 있을 수 있습니다. 디바이스의 네트워크 구성 및 설정을 검토합니다.
Warning
게이트웨이의
[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 Edge 게이트웨이와 Microsoft Defender for IoT 통합
다운스트림 디바이스 프록시를 사용하여 Microsoft Defender for IoT의 마이크로 에이전트를 IoT Edge 게이트웨이와 통합하는 데 다운스트림 디바이스를 사용할 수 있습니다.
Defender for IoT 마이크로 에이전트에 대해 자세히 알아봅니다.
다운스트림 디바이스 프록시를 사용하여 Microsoft Defender for IoT를 IoT Edge와 통합하려면 다음을 수행합니다.
Azure Portal에 로그인합니다.
IoT Hub>
Your Hub
>디바이스 관리>디바이스로 이동합니다.디바이스를 선택합니다.
이러한 지침에서 만들었던
DefenderIotMicroAgent
모듈 쌍을 선택합니다.단추를 선택하여 연결 문자열(기본 키)을 복사합니다.
연결 문자열을 텍스트 편집 애플리케이션에 붙여넣고 GatewayHostName을 문자열에 추가합니다. GatewayHostName은 부모 디바이스의 정규화된 도메인 이름 또는 IP 주소입니다. 예들 들어
HostName=nested11.azure-devices.net;DeviceId=downstream1;ModuleId=module1;SharedAccessKey=xxx;GatewayHostName=10.16.7.4
입니다.다운스트림 디바이스에서 터미널을 엽니다.
다음 명령을 사용하여 클라우드용 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
경로 위치에 있어야 합니다.다음 명령을 사용하여 서비스를 다시 시작합니다.
sudo systemctl restart defender-iot-micro-agent.service
다시 디바이스 목록으로 이동합니다.
IoT Hub에 대한 연결을 사용하도록 설정하고 기어 아이콘을 선택합니다.
표시된 목록에서 부모 디바이스를 선택합니다.
다운스트림 디바이스와 IoT Edge 디바이스 간의 포트 8883(MQTT)이 열려 있는지 확인합니다.