다음을 통해 공유


자습서: Azure IoT Edge용 EST(Enrollment over Secure Transport) 서버 구성

적용 대상: IoT Edge 1.5 확인 표시 IoT Edge 1.5 IoT Edge 1.4 확인 표시 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 업데이트를 참조하세요.

Azure IoT Edge를 사용하면 EST(Enrollment over Secure Transport) 서버를 사용하여 x509 인증서를 관리하도록 디바이스를 구성할 수 있습니다.

이 자습서에서는 테스트 EST 서버를 호스트하고 x509 인증서 등록 및 갱신을 위한 IoT Edge 디바이스를 구성하는 방법을 안내합니다. 이 자습서에서는 다음을 하는 방법을 알아볼 수 있습니다.

  • 테스트 EST 서버 만들기 및 호스트
  • DPS 그룹 등록 구성
  • 디바이스 구성

이 자습서를 완료하는 데 필요한 세 단계를 간략하게 보여주는 다이어그램.

필수 조건

Enrollment over Secure Transport란?

EST(Enrollment over Secure Transport)는 x.509 인증서 발급을 자동화하는 암호화 프로토콜입니다. CA(인증 기관)에 연결된 클라이언트 인증서가 필요한 IoT Edge와 같은 PKI(공개 키 인프라) 클라이언트에 사용됩니다. 인증서를 수동으로 관리하면 위험하고 오류가 발생하기 쉬운데, EST를 사용하면 수동으로 관리할 필요가 없습니다.

EST 서버

인증서 발급 및 갱신의 경우 디바이스에서 액세스할 수 있는 EST 서버가 필요합니다.

Important

엔터프라이즈급 솔루션의 경우 GlobalSign IoT Edge 등록 또는 DigiCert IoT 디바이스 관리자를 고려합니다.

테스트 및 개발에는 테스트 EST 서버를 사용할 수 있습니다. 이 자습서에서는 테스트 EST 서버를 만듭니다.

디바이스에서 EST 서버 실행

빠르게 시작하기 위해 이 자습서에서는 IoT Edge 디바이스의 컨테이너에 로컬로 간단한 EST 서버를 배포하는 단계를 보여줍니다. 이 방법은 가장 간단하게 시도할 수 있는 방법입니다.

Dockerfile은 libest라고 하는 Cisco 라이브러리인 Ubuntu 18.04 및 샘플 서버 코드를 사용합니다. 다음 설정으로 구성되며, 설정은 변경 가능합니다.

  • 20년 동안 유효한 루트 CA
  • 10년 동안 유효한 EST 서버 인증서
  • 인증서 기본 일 수를 1로 설정하여 EST 갱신 테스트
  • EST 서버는 컨테이너의 IoT Edge 디바이스에서 로컬로 실행

주의

프로덕션 환경에서는 이 Dockerfile을 사용하지 마세요.

  1. SSH 등을 통해 IoT Edge를 설치한 디바이스에 연결합니다.

  2. Dockerfile(대/소문자 구분)이라는 파일을 만들고, 원하는 텍스트 편집기를 사용하여 샘플 콘텐츠를 추가합니다.

    EST 서버를 Azure Container Instance에 호스트하려면 myestserver.westus.azurecontainer.io를 EST 서버의 DNS 이름으로 변경합니다. DNS 이름을 선택할 때 Azure Container 인스턴스의 DNS 레이블은 5자 이상이어야 합니다.

    # DO NOT USE IN PRODUCTION - Use only for testing #
    
    FROM ubuntu:18.04
    
    RUN apt update && apt install -y apache2-utils git openssl libssl-dev build-essential && \
        git clone https://github.com/cisco/libest.git && cd libest && \
        ./configure --disable-safec && make install && \
        rm -rf /src && apt remove --quiet -y libssl-dev build-essential && \
        apt autoremove -y && apt clean -y && apt autoclean -y && \
        rm -rf /var/lib/apt /tmp/* /var/tmp/*
    
    WORKDIR /libest/example/server/
    
    # Setting the root CA expiration to 20 years
    RUN sed -i "s|-days 365|-days 7300 |g" ./createCA.sh
    
    ## If you want to host your EST server remotely (for example, an Azure Container Instance),
    ## change myestserver.westus.azurecontainer.io to the fully qualified DNS name of your EST server
    ## OR, change the IP address
    ## and uncomment the corresponding line.
    # RUN sed -i "s|DNS.2 = ip6-localhost|DNS.2 = myestserver.westus.azurecontainer.io|g" ./ext.cnf
    # RUN sed -i "s|IP.2 = ::1|IP.2 = <YOUR EST SERVER IP ADDRESS>|g" ./ext.cnf
    
    # Set EST server certificate to be valid for 10 years
    RUN sed -i "s|-keyout \$EST_SERVER_PRIVKEY -subj|-keyout \$EST_SERVER_PRIVKEY -days 7300 -subj |g" ./createCA.sh
    
    # Create the CA
    RUN echo 1 | ./createCA.sh
    
    # Set cert default-days to 1 to show EST renewal
    RUN sed -i "s|default_days   = 365|default_days   = 1 |g" ./estExampleCA.cnf
    
    # The EST server listens on port 8085 by default
    # Uncomment to change the port to 443 or something else. If changed, EXPOSE that port instead of 8085. 
    # RUN sed -i "s|estserver -c|estserver -p 443 -c |g" ./runserver.sh
    EXPOSE 8085
    CMD ./runserver.sh
    
  3. Dockerfile이 들어 있는 디렉터리에서 샘플 Dockerfile로 이미지를 빌드합니다.

    sudo docker build . --tag est
    
  4. 컨테이너를 시작하고 컨테이너의 포트 8085를 호스트의 포트 8085에 노출합니다.

    sudo docker run -d -p 8085:8085 est
    
  5. 이제 EST 서버가 실행 중이며 포트 8085에서 localhost를 사용하여 연결할 수 있습니다. 서버 인증서를 확인하는 명령을 실행하여 EST 서버가 사용 가능한지 확인합니다.

    openssl s_client -showcerts -connect localhost:8085
    
  6. 출력 중간에 -----BEGIN CERTIFICATE-----가 표시됩니다. 인증서를 검색하면 서버에 연결할 수 있고 인증서를 표시할 수 있다는 것이 확인됩니다.

클라우드에서 이 컨테이너를 실행하려면 이미지를 빌드하고 이미지를 Azure Container Registry로 푸시합니다. 그런 다음, 빠른 시작에 따라 Azure Container Instance에 배포합니다.

CA 인증서 다운로드

각 디바이스에는 디바이스 ID 인증서에 연결된 CA(인증 기관) 인증서가 필요합니다.

  1. IoT Edge 디바이스에 /var/aziot/certs 디렉터리가 없으면 이 디렉터리를 만들고 디렉터리를 해당 디렉터리로 변경합니다.

    # If the certificate directory doen'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
    
    # Change directory to /var/aziot/certs
    cd /var/aziot/certs
    
  2. EST 서버에서 /var/aziot/certs 디렉터리로 CA 인증서를 검색하고 이름을 cacert.crt.pem으로 지정합니다.

    openssl s_client -showcerts -verify 5 -connect localhost:8085 < /dev/null | sudo awk '/BEGIN/,/END/{ if(/BEGIN/){a++}; out="cert"a".pem"; print >out}' && sudo cp cert2.pem cacert.crt.pem
    
  3. 인증서는 주요 서비스 사용자 aziotcs의 소유여야 합니다. 모든 인증서 파일의 소유권을 aziotcs로 설정하고 권한을 설정합니다. 인증서 소유권 및 권한에 대한 자세한 내용은 권한 요구 사항을 참조하세요.

    # Give aziotcs ownership to certificates
    sudo chown -R aziotcs:aziotcs /var/aziot/certs
    # Read and write for aziotcs, read-only for others
    sudo find /var/aziot/certs -type f -name "*.*" -exec chmod 644 {} \;
    

DPS를 사용하여 IoT Edge 디바이스 프로비저닝

Device Provisioning Service를 사용하면 IoT Edge의 EST 서버에서 인증서를 자동으로 발급하고 갱신할 수 있습니다. 자습서 EST 서버를 사용하는 경우 ID 인증서가 하루 후에 만료되므로 IoT Hub에서 수동 프로비저닝이 불가능합니다. 인증서가 만료될 때마다 IoT Hub에서 지문을 수동으로 업데이트해야 하기 때문입니다. 등록 그룹을 사용하여 DPS CA를 인증하면 수동 단계 없이 디바이스 ID 인증서를 갱신할 수 있습니다.

DPS에 CA 인증서 업로드

  1. IoT Hub에 연결된 Device Provisioning Service가 없는 경우 빠른 시작: Azure Portal에서 IoT Hub Device Provisioning Service 설정을 참조하세요.

  2. 디바이스에 있는 cacert.crt.pem 파일을 개발 컴퓨터처럼 Azure Portal에 액세스할 수 있는 컴퓨터로 전송합니다. 인증서를 전송하는 쉬운 방법은 원격으로 디바이스에 연결하고, cat /var/aziot/certs/cacert.crt.pem 명령을 사용하여 인증서를 표시하고, 전체 출력을 복사하고, 개발 컴퓨터의 새 파일에 콘텐츠를 붙여넣는 것입니다.

  3. Azure Portal에서 IoT Hub Device Provisioning Service 인스턴스로 이동합니다.

  4. 설정에서 인증서, +추가를 차례로 선택합니다.

    Azure Portal을 사용하여 Device Provisioning Service에 CA 인증서를 추가하는 스크린샷.

    설정
    인증서 이름 CA 인증서의 식별 이름을 입력합니다.
    인증서 .pem 또는 .cer 파일 EST 서버에서 cacert.crt.pem을 찾습니다.
    업로드 시 인증서 상태를 확인됨으로 설정 확인란 선택
  5. 저장을 선택합니다.

등록 그룹 만들기

  1. Azure Portal에서 IoT Hub Device Provisioning Service 인스턴스로 이동합니다.

  2. 설정에서 등록 관리를 선택합니다.

  3. 등록을 구성하려면 등록 그룹 추가를 선택한 다음, 다음 단계를 완료합니다.

  4. 등록 + 프로비저닝 탭에서 다음 설정을 선택합니다.

    Azure Portal을 사용하여 DPS 등록 그룹을 추가하는 스크린샷.

    설정
    증명 메커니즘 이 디바이스 프로비저닝 서비스 인스턴스에 업로드된 X.509 인증서 선택
    기본 인증서 드롭다운 목록에서 인증서를 선택합니다.
    그룹 이름 이 그룹 등록의 식별 이름을 입력합니다.
    프로비전 상태 이 등록 사용 확인란 선택
  5. IoT 허브 탭의 목록에서 IoT Hub를 선택합니다.

  6. 디바이스 설정 탭에서 프로비전된 디바이스의 IoT Edge 사용 확인란을 선택합니다.

    나머지 설정은 이 자습서와 관련이 없습니다. 기본 설정을 적용할 수 있습니다.

  7. 검토 + 만들기를 선택합니다.

이제 디바이스에 대한 등록이 있으므로 IoT Edge 런타임은 연결된 IoT Hub의 디바이스 인증서를 자동으로 관리할 수 있습니다.

IoT Edge 디바이스 구성

EST 서버의 디바이스 인증서를 사용하도록 IoT Edge 디바이스에서 IoT Edge 구성 파일을 업데이트합니다.

  1. 편집기를 사용하여 IoT Edge 구성 파일을 엽니다. 예를 들어 nano 편집기를 사용하여 /etc/aziot/config.toml 파일을 엽니다.

    sudo nano /etc/aziot/config.toml
    
  2. 구성 파일에서 다음 섹션을 추가하거나 바꿉니다. 이러한 구성 설정은 처음에 사용자 이름 및 암호 인증을 사용하여 EST 서버에서 디바이스 인증서를 가져옵니다. 디바이스 인증서는 나중에 인증서를 갱신할 때 EST 서버에 인증하는 데 사용됩니다.

    자리 표시자 텍스트 <DPS-ID-SCOPE>를 등록된 디바이스가 들어 있는 IoT Hub에 연결된 DPS의 ID 범위로 바꾸고, myiotedgedevice를 Azure IoT Hub에 등록된 디바이스 ID로 바꿉니다. ID 범위 값은 DPS 개요 페이지에서 찾을 수 있습니다.

    # DPS provisioning with X.509 certificate
    # Replace with ID Scope from your DPS
    [provisioning]
    source = "dps"
    global_endpoint = "https://global.azure-devices-provisioning.net"
    id_scope = "<DPS-ID-SCOPE>"
    
    [provisioning.attestation]
    method = "x509"
    registration_id = "myiotedgedevice"
    
    [provisioning.attestation.identity_cert]
    method = "est"
    common_name = "myiotedgedevice"
    
    # Auto renewal settings for the identity cert
    # Available only from IoT Edge 1.3 and above
    [provisioning.attestation.identity_cert.auto_renew]
    rotate_key = false
    threshold = "80%"
    retry = "4%"
    
    # Trusted root CA certificate in the global EST options
    # Optional if the EST server's TLS certificate is already trusted by the system's CA certificates.
    [cert_issuance.est]
        trusted_certs = [
            "file:///var/aziot/certs/cacert.crt.pem",
        ]
    
    # The default username and password for libest
    # Used for initial authentication to EST server
    #
    # Not recommended for production
    [cert_issuance.est.auth]
    username = "estuser"
    password = "estpwd"
    
    [cert_issuance.est.urls]
    default = "https://localhost:8085/.well-known/est"
    

    참고 항목

    이 예제에서 IoT Edge는 인증서를 가져와야 할 때마다 사용자 이름과 암호를 사용하여 EST 서버에 인증합니다. 이 방법은 1) 비밀을 일반 텍스트로 저장해야 하고 2) IoT Edge에서 ID 인증서를 사용하여 EST 서버에 인증해야 하므로 프로덕션 환경에서는 이 방법을 사용하지 않는 것이 좋습니다. 프로덕션 환경에 사용하도록 수정하려면 다음을 수행합니다.

    1. DPS에 권장하는 접근 방식과 유사하게 제작하는 중에 디바이스에 저장할 수 있는 수명이 긴 부트스트랩 인증서를 사용하는 것이 좋습니다. EST 서버의 부트스트랩 인증서를 구성하는 방법은 EST를 통해 동적으로 발급된 인증서를 사용하여 디바이스 인증을 참조하세요.
    2. 위의 프로비저닝 인증서 자동 갱신 구성과 동일한 구문을 사용하여 [cert_issuance.est.identity_auto_renew]를 구성합니다.

    이러한 방식으로 IoT Edge 인증서 서비스는 EST 서버에 처음 인증할 때에는 부트스트랩 인증서를 사용하고, 이후 동일한 서버에 EST를 요청할 때에는 ID 인증서를 요청합니다. 어떤 이유로 EST ID 인증서가 갱신 전에 만료되면 IoT Edge는 다시 부트스트랩 인증서를 사용합니다.

  3. sudo iotedge config apply를 실행하여 새 설정을 적용합니다.

  4. sudo iotedge check를 실행하여 IoT Edge 디바이스 구성을 확인합니다. 모든 구성 검사가 성공해야 합니다. 이 자습서에서는 프로덕션 준비 오류와 경고, DNS 서버 경고 및 연결 검사를 무시해도 됩니다.

  5. IoT Hub의 디바이스로 이동합니다. DPS 및 EST 서버를 사용하여 인증서 지문이 디바이스에 자동으로 추가되었습니다.

    Azure Portal의 IoT Hub 디바이스 설정 스크린샷. 인증서 지문 필드에는 값이 표시됩니다.

    참고 항목

    새 IoT Edge 디바이스를 만들면 상태 코드 417 -- The device's deployment configuration is not set in the Azure portal.이 표시됩니다. 이 상태는 정상이며, 디바이스가 모듈 배포를 받을 준비가 되었다는 의미입니다.

인증서 갱신 테스트

디바이스에서 기존 인증서와 키를 제거한 후 IoT Edge 구성을 적용하여 디바이스 ID 인증서를 즉시 재발급할 수 있습니다. IoT Edge는 누락된 파일을 검색하고 새 인증서를 요청합니다.

  1. IoT Edge 디바이스에서 IoT Edge 런타임을 중지합니다.

    sudo iotedge system stop
    
  2. 기존 인증서 및 키를 삭제합니다.

    sudo sh -c "rm /var/lib/aziot/certd/certs/*"
    sudo sh -c "rm /var/lib/aziot/keyd/keys/*"
    
  3. IoT Edge 구성을 적용하여 인증서를 갱신합니다.

    sudo iotedge config apply
    

    런타임이 시작될 때까지 몇 분 정도 기다려야 할 수도 있습니다.

  4. IoT Hub의 디바이스로 이동합니다. 인증서 지문이 업데이트되었습니다.

    Azure Portal의 IoT Hub 디바이스 설정 스크린샷. 인증서 지문 필드에 새 값이 표시됩니다.

  5. sudo ls -l /var/lib/aziot/certd/certs 명령을 사용하여 인증서 파일을 나열합니다. 디바이스 인증서 파일의 최근 생성 날짜가 표시됩니다.

  6. openssl 명령을 사용하여 새 인증서 내용을 검사합니다. 예시:

    sudo openssl x509 -in /var/lib/aziot/certd/certs/deviceid-bd732105ef89cf8edd2606a5309c8a26b7b5599a4e124a0fe6199b6b2f60e655.cer -text -noout
    

    디바이스 인증서 파일 이름(.cer)을 디바이스의 인증서 파일로 바꿉니다.

    인증서 유효성 검사 날짜 범위가 변경된 것을 볼 수 있습니다.

다음은 인증서 갱신을 테스트할 수 있는 다른 방법입니다. 이러한 검사는 인증서가 만료되거나 누락되었을 때 IoT Edge가 EST 서버의 인증서를 어떻게 갱신하는지 보여줍니다. 각 테스트 후에는 Azure Portal에서 새 지문을 확인하고 openssl 명령을 사용하여 새 인증서를 확인할 수 있습니다.

  1. 하루를 기다리면 인증서가 만료됩니다. 테스트 EST 서버는 하루 후에 만료되는 인증서를 만들도록 구성되었습니다. IoT Edge는 자동으로 인증서를 갱신합니다.
  2. config.toml에 설정된 자동 갱신의 비율을 threshold에서 조정해 봅니다(현재 예제 구성에서는 80%로 설정됨). 예를 들어 10%로 설정하고 2시간마다 인증서 갱신을 관찰합니다.
  3. threshold를 정수로 조정한 후 m(분)으로 조정해 봅니다. 예를 들어 60m으로 설정하고 만료 1시간 전에 인증서 갱신을 관찰합니다.

리소스 정리

이 자습서에서 만든 리소스와 구성을 그대로 두고 재사용할 수 있습니다. 그렇지 않은 경우 요금이 발생하지 않도록 이 문서에서 사용한 로컬 구성 및 Azure 리소스를 삭제할 수 있습니다.

Azure 리소스 삭제

Azure 리소스와 리소스 그룹을 삭제하면 되돌릴 수 없습니다. 잘못된 리소스 그룹 또는 리소스를 자동으로 삭제하지 않도록 해야 합니다. 보관하려는 리소스가 있는 기존 리소스 그룹 내에 IoT 허브를 만든 경우 리소스 그룹이 아닌 IoT 허브 리소스만 삭제해야 합니다.

리소스를 삭제하려면:

  1. Azure Portal에 로그인한 다음, 리소스 그룹을 선택합니다.

  2. IoT Hub 테스트 리소스가 포함된 리소스 그룹 이름을 선택합니다.

  3. 리소스 그룹에 포함된 리소스 목록을 검토합니다. 모든 항목을 삭제하려는 경우리소스 그룹 삭제를 선택할 수 있습니다. 일부만 삭제하려는 경우 각 리소스를 선택하여 개별적으로 삭제할 수 있습니다.

다음 단계