빠른 시작: X.509 인증서 시뮬레이션된 디바이스 프로비저닝

이 빠른 시작에서는 Windows 머신에서 시뮬레이션된 디바이스를 만듭니다. 시뮬레이션된 디바이스는 인증에 X.509 인증서 증명 메커니즘을 사용하도록 구성됩니다. 디바이스를 구성한 후 Azure IoT Hub Device Provisioning Service를 사용하여 IoT 허브에 프로비전합니다.

프로비저닝 프로세스에 익숙하지 않은 경우 프로비저닝 개요를 검토하세요. 계속하기 전에 Azure Portal에서 IoT Hub Device Provisioning Service 설정의 단계를 완료해야 합니다.

이 빠른 시작에서는 Windows 기반 워크스테이션을 위한 솔루션을 보여줍니다. 그러나 Linux에서 절차를 수행할 수도 있습니다. Linux 예제는 자습서: 지역 대기 시간 프로비저닝을 참조하세요.

필수 조건

다음 필수 구성 요소는 Windows 개발 환경을 위한 것입니다. Linux 또는 macOS의 경우 SDK 설명서에서 개발 환경 준비의 해당 섹션을 참조하세요.

  • Visual Studio 2022를 설치하고 'C++를 사용한 데스크톱 개발' 워크로드를 사용하도록 설정합니다. Visual Studio 2015, Visual Studio 2017 및 Visual Studio 19도 지원됩니다. Linux 또는 macOS의 경우 SDK 설명서에서 개발 환경 준비의 해당 섹션을 참조하세요.

  • 최신 CMake 빌드 시스템을 설치합니다. CMake 실행 파일을 경로에 추가하는 옵션을 선택했는지 확인합니다.

    Important

    CMake 설치를 시작하기 전에 Visual Studio 필수 구성 요소(Visual Studio 및 ‘C++를 사용한 데스크톱 개발’ 워크로드)가 머신에 설치되어 있는지 확인합니다. 필수 구성 요소가 설치되고 다운로드를 확인하면 CMake 빌드 시스템을 설치합니다. 이전 버전의 CMake 빌드 시스템은 이 문서에 사용된 솔루션 파일을 생성하지 못합니다. 최신 버전의 CMake를 사용해야 합니다.

다음 필수 구성 요소는 Windows 개발 환경을 위한 것입니다. Linux 또는 macOS의 경우 SDK 설명서에서 개발 환경 준비의 해당 섹션을 참조하세요.

  • Windows 기반 머신에 .NET SDK 6.0 이상을 설치합니다. 다음 명령을 사용하여 버전을 확인할 수 있습니다.

    dotnet --info
    

다음 필수 구성 요소는 Windows 개발 환경을 위한 것입니다. Linux 또는 macOS의 경우 SDK 설명서에서 개발 환경 준비의 해당 섹션을 참조하세요.

다음 필수 구성 요소는 Windows 개발 환경을 위한 것입니다.

다음 필수 구성 요소는 Windows 개발 환경을 위한 것입니다. Linux 또는 macOS의 경우 SDK 설명서에서 개발 환경 준비의 해당 섹션을 참조하세요.

  • 최신 버전의 Git을 설치합니다. Git이 명령 창에 액세스할 수 있는 환경 변수에 추가되었는지 확인합니다. 설치할 git 도구의 최신 버전은 Software Freedom Conservancy의 Git 클라이언트 도구를 참조하세요. 여기에는 로컬 Git 리포지토리와 상호 작용하는 데 사용할 수 있는 명령줄 앱인 Git Bash가 포함됩니다.

  • 컴퓨터에 OpenSSL이 설치되어 있는지 확인합니다. Windows에서 Git 설치에는 OpenSSL 설치가 포함됩니다. Git Bash 프롬프트에서 OpenSSL에 액세스할 수 있습니다. OpenSSL이 설치되었는지 확인하려면 Git Bash 프롬프트를 열고 openssl version을 입력합니다.

    참고 항목

    OpenSSL에 익숙하지 않고 Windows 컴퓨터에 이미 설치되어 있지 않은 경우 Git Bash 프롬프트에서 OpenSSL을 사용하는 것이 좋습니다. 또는 소스 코드를 다운로드하고 OpenSSL을 빌드하도록 선택할 수 있습니다. 자세한 내용은 OpenSSL 다운로드 페이지를 참조하세요. 또는 타사에서 사전 빌드된 OpenSSL을 다운로드할 수 있습니다. 자세한 내용은 OpenSSL 위키를 참조하세요. Microsoft는 타사에서 다운로드한 패키지의 유효성에 대해 보증하지 않습니다. OpenSSL을 빌드하거나 다운로드하기로 선택한 경우 경로에서 OpenSSL 이진 파일에 액세스할 수 있고 OPENSSL_CNF 환경 변수가 openssl.cnf 파일의 경로로 설정되어 있는지 확인합니다.

  • Windows 명령 프롬프트와 Git Bash 프롬프트를 모두 엽니다.

    이 빠른 시작의 단계에서는 Windows 컴퓨터와 Git의 일부로 설치된 OpenSSL 설치를 사용하고 있다고 가정합니다. Git Bash 프롬프트를 사용하여 OpenSSL 명령을 실행하고 그 밖의 모든 작업에는 Windows 명령 프롬프트를 사용합니다. Linux를 사용하는 경우 Bash 셸에서 모든 명령을 실행할 수 있습니다.

개발 환경 준비

이 섹션에서는 Azure IoT C SDK를 빌드하는 데 사용되는 개발 환경을 준비합니다. 샘플 코드는 디바이스의 부팅 시퀀스 중에 디바이스를 프로비저닝하려고 시도합니다.

  1. 웹 브라우저를 열고 Azure IoT C SDK 릴리스 페이지로 이동합니다.

  2. 페이지 맨 위에서 태그 탭을 선택합니다.

  3. Azure IoT C SDK의 최신 릴리스에 대한 태그 이름을 복사합니다.

  4. Windows 명령 프롬프트에서 다음 명령을 실행하여 C용 Azure IoT 디바이스 SDK GitHub 리포지토리의 최신 릴리스를 복제합니다. <release-tag>를 이전 단계에서 복사한 태그로 바꿉니다(예: lts_01_2023).

    git clone -b <release-tag> https://github.com/Azure/azure-iot-sdk-c.git
    cd azure-iot-sdk-c
    git submodule update --init
    

    이 작업을 완료하는 데 몇 분 정도 걸릴 수 있습니다.

  5. 작업이 완료되면 azure-iot-sdk-c 디렉터리에서 다음 명령을 실행합니다.

    mkdir cmake
    cd cmake
    
  6. 코드 샘플에서는 X.509 인증서를 사용하여 X.509 인증을 통해 증명을 제공합니다. 다음 명령을 실행하여 디바이스 프로비저닝 클라이언트를 포함하는 개발 플랫폼과 관련된 SDK 버전을 빌드합니다. 시뮬레이션된 디바이스에 대한 Visual Studio 솔루션이 cmake 디렉터리에서 생성됩니다.

    다음 명령에서 -Dhsm_custom_lib와 함께 사용할 경로를 지정할 때 이전에 만든 cmake 디렉터리의 라이브러리에 대한 절대 경로를 사용해야 합니다. 표시된 경로는 C 드라이브의 루트 디렉터리에 C SDK를 복제했다고 가정합니다. 다른 디렉터리를 사용한 경우 그에 따라 경로를 조정합니다.

    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 ..
    

cmake이(가) C++ 컴파일러를 찾지 못하면 위의 명령을 실행하는 동안 빌드 오류가 발생할 수 있습니다. 이 경우에는 Visual Studio 명령 프롬프트에서 명령을 실행합니다.

  1. 빌드가 성공되면 마지막 몇 개의 출력 줄은 다음 출력과 유사하게 표시됩니다.

    -- 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용 Azure IoT SDK GitHub 리포지토리를 복제합니다.

git clone https://github.com/Azure/azure-iot-sdk-node.git

Windows 명령 프롬프트에서 다음 명령을 사용하여 Python용 Azure IoT SDK GitHub 리포지토리를 복제합니다.

git clone -b v2 https://github.com/Azure/azure-iot-sdk-python.git --recursive

참고 항목

이 자습서에 사용된 샘플은 azure-iot-sdk-python 리포지토리의 v2 분기에 있습니다. Python SDK의 V3는 베타에서 사용할 수 있습니다.

  1. Windows 명령 프롬프트에서 다음 명령을 사용하여 Azure IoT Samples for Java GitHub 리포지토리를 복제합니다.

    git clone https://github.com/Azure/azure-iot-sdk-java.git --recursive
    
  2. 필요한 모든 패키지를 다운로드하려면 루트 azure-iot-sdk-java 디렉터리로 이동하고 프로젝트를 빌드합니다.

    cd azure-iot-sdk-java
    mvn install -DskipTests=true
    

자체 서명된 X.509 디바이스 인증서 만들기

이 섹션에서는 OpenSSL을 사용하여 자체 서명된 X.509 인증서와 프라이빗 키를 만듭니다. 이 인증서는 프로비전 서비스 인스턴스에 업로드되고 서비스에서 확인됩니다.

주의

이 빠른 시작에서 OpenSSL로 만든 인증서는 개발 테스트용으로만 사용합니다. 프로덕션 환경에서는 이러한 인증서를 사용하지 마세요. 이러한 인증서는 30일 후에 만료되며 1234와 같이 하드 코딩된 암호를 포함할 수 있습니다. 프로덕션에 사용하기에 적합한 인증서를 가져오는 방법에 대해 알아보려면 Azure IoT Hub 설명서에서 X.509 CA 인증서를 가져오는 방법을 참조하세요.

Git Bash 프롬프트에서 이 섹션의 단계를 수행합니다.

  1. Git Bash 프롬프트에서 인증서를 만들 디렉터리로 이동합니다.

  2. 다음 명령을 실행합니다.

    winpty openssl req -outform PEM -x509 -sha256 -newkey rsa:4096 -keyout device-key.pem -out device-cert.pem -days 30 -extensions usr_cert -addext extendedKeyUsage=clientAuth -subj "//CN=my-x509-device"
    

    Important

    주체 이름(//CN=my-x509-device)에 제공된 추가 슬래시는 Windows 플랫폼에서 Git을 사용하여 문자열을 이스케이프하는 데만 필요합니다.

  3. PEM 암호 입력:이라는 메시지가 표시되면 암호 1234를 사용합니다.

  4. 확인 - PEM 암호 입력:이라는 메시지가 표시되면 암호 1234를 다시 사용합니다.

    공개 키 인증서 파일(device-cert.pem) 및 프라이빗 키 파일(device-key.pem)이 openssl 명령을 실행한 디렉터리에 생성됩니다.

    인증서 파일에서 주체 CN(일반 이름)이 my-x509-device로 설정되어 있습니다. X.509 기반 등록의 경우 등록 ID가 일반 이름으로 설정됩니다. 등록 ID는 영숫자 문자의 대/소문자를 구분하지 않는 문자열과 특수 문자인 '-', '.', '_', ':'입니다. 마지막 문자는 영숫자 또는 대시('-')여야 합니다. 일반 이름은 이 형식을 따라야 합니다. DPS는 최대 128자 길이의 등록 ID를 지원합니다. 그러나 X.509 인증서의 주체 일반 이름의 최대 길이는 64자입니다. 따라서 등록 ID는 X.509 인증서를 사용할 때 64자로 제한됩니다.

  5. 인증서 파일은 Base 64로 인코딩됩니다. 인증서 파일의 주체 CN(일반 이름) 및 기타 속성을 보려면 다음 명령을 입력합니다.

    winpty openssl x509 -in device-cert.pem -text -noout
    
    Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            77:3e:1d:e4:7e:c8:40:14:08:c6:09:75:50:9c:1a:35:6e:19:52:e2
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN = my-x509-device
        Validity
            Not Before: May  5 21:41:42 2022 GMT
            Not After : Jun  4 21:41:42 2022 GMT
        Subject: CN = my-x509-device
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (4096 bit)
                Modulus:
                    00:d2:94:37:d6:1b:f7:43:b4:21:c6:08:1a:d6:d7:
                    e6:40:44:4e:4d:24:41:6c:3e:8c:b2:2c:b0:23:29:
                    ...
                    23:6e:58:76:45:18:03:dc:2e:9d:3f:ac:a3:5c:1f:
                    9f:66:b0:05:d5:1c:fe:69:de:a9:09:13:28:c6:85:
                    0e:cd:53
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                63:C0:B5:93:BF:29:F8:57:F8:F9:26:44:70:6F:9B:A4:C7:E3:75:18
            X509v3 Authority Key Identifier:
                keyid:63:C0:B5:93:BF:29:F8:57:F8:F9:26:44:70:6F:9B:A4:C7:E3:75:18
    
            X509v3 Extended Key Usage:
                TLS Web Client Authentication
    Signature Algorithm: sha256WithRSAEncryption
         82:8a:98:f8:47:00:85:be:21:15:64:b9:22:b0:13:cc:9e:9a:
         ed:f5:93:b9:4b:57:0f:79:85:9d:89:47:69:95:65:5e:b3:b1:
         ...
         cc:b2:20:9a:b7:f2:5e:6b:81:a1:04:93:e9:2b:92:62:e0:1c:
         ac:d2:49:b9:36:d2:b0:21
    
  1. 샘플 코드에는 암호화되지 않은 프라이빗 키가 필요합니다. 암호화되지 않은 프라이빗 키를 만들려면 다음 명령을 실행합니다.

    winpty openssl rsa -in device-key.pem -out unencrypted-device-key.pem
    
  2. device-key.pem에 대한 암호 입력:을 묻는 메시지가 표시되면 이전에 했던 것과 동일한 암호(1234)를 사용합니다.

Git Bash 프롬프트를 열어 둡니다. 이 빠른 시작의 뒷부분에서 필요합니다.

C# 샘플 코드는 암호로 보호된 PKCS#12 형식 파일(certificate.pfx)에 저장된 X.509 인증서를 사용하도록 설정되어 있습니다. 이 빠른 시작의 뒷부분에서 개별 등록 항목을 만들기 위해 방금 만든 PEM 형식의 공개 키 인증서 파일(device-cert.pem)이 여전히 필요합니다.

  1. 샘플에서 예상하는 PKCS12 형식 파일을 생성하려면 다음 명령을 입력합니다.

    winpty openssl pkcs12 -inkey device-key.pem -in device-cert.pem -export -out certificate.pfx
    
  2. device-key.pem에 대한 암호 입력:을 묻는 메시지가 표시되면 이전에 했던 것과 동일한 암호(1234)를 사용합니다.

  3. 내보내기 암호 입력:을 묻는 메시지가 표시되면 1234 암호를 사용합니다.

  4. Verifying - Enter Export Password:라는 메시지가 표시되면 암호 1234를 다시 사용합니다.

    이제 PKCS12 형식의 인증서 파일(certificate.pfx)이 openssl 명령을 실행한 디렉터리에 생성되어야 합니다.

  5. PKCS12 형식의 인증서 파일을 X.509 디바이스 프로비전 샘플의 프로젝트 디렉터리에 복사합니다. 지정된 경로는 샘플 리포지토리를 다운로드한 위치에 상대적입니다.

    cp certificate.pfx ./azure-iot-sdk-csharp/provisioning/device/samples/"Getting Started"/X509Sample
    

이 빠른 시작의 나머지 부분에서는 Git Bash 프롬프트가 필요하지 않습니다. 그러나 이후 단계에서 문제가 발생할 경우 인증서를 확인하기 위해 열어 두는 것이 좋습니다.

  1. 샘플 코드에는 암호화되지 않은 프라이빗 키가 필요합니다. 암호화되지 않은 프라이빗 키를 만들려면 다음 명령을 실행합니다.

    winpty openssl rsa -in device-key.pem -out unencrypted-device-key.pem
    
  2. device-key.pem에 대한 암호 입력:을 묻는 메시지가 표시되면 이전에 했던 것과 동일한 암호(1234)를 사용합니다.

  3. X.509 디바이스 프로비전 샘플의 프로젝트 디렉터리에 디바이스 인증서 및 암호화되지 않은 프라이빗 키를 복사합니다. 제공된 경로는 SDK를 다운로드한 위치에 상대적입니다.

    cp device-cert.pem ./azure-iot-sdk-node/provisioning/device/samples
    cp unencrypted-device-key.pem ./azure-iot-sdk-node/provisioning/device/samples
    

이 빠른 시작의 나머지 부분에서는 Git Bash 프롬프트가 필요하지 않습니다. 그러나 이후 단계에서 문제가 발생할 경우 인증서를 확인하기 위해 열어 두는 것이 좋습니다.

  1. X.509 디바이스 프로비전 샘플의 프로젝트 디렉터리에 디바이스 인증서 및 프라이빗 키를 복사합니다. 제공된 경로는 SDK를 다운로드한 위치에 상대적입니다.

    cp device-cert.pem ./azure-iot-sdk-python/samples/async-hub-scenarios
    cp device-key.pem ./azure-iot-sdk-python/samples/async-hub-scenarios
    

이 빠른 시작의 나머지 부분에서는 Git Bash 프롬프트가 필요하지 않습니다. 그러나 이후 단계에서 문제가 발생할 경우 인증서를 확인하기 위해 열어 두는 것이 좋습니다.

  1. Java 샘플 코드에는 암호화되지 않은 프라이빗 키가 필요합니다. 암호화되지 않은 프라이빗 키를 만들려면 다음 명령을 실행합니다.

    winpty openssl pkey -in device-key.pem -out unencrypted-device-key.pem
    
  2. device-key.pem에 대한 암호 입력:을 묻는 메시지가 표시되면 이전에 했던 것과 동일한 암호(1234)를 사용합니다.

Git Bash 프롬프트를 열어 둡니다. 이 빠른 시작의 뒷부분에서 필요합니다.

디바이스 등록 만들기

Azure IoT Device Provisioning 서비스는 다음과 같은 두 가지 등록을 지원합니다.

  • 등록 그룹: 여러 관련 디바이스를 등록하는 데 사용됩니다.
  • 개별 등록: 단일 디바이스를 등록하는 데 사용됩니다.

이 문서에서는 IoT 허브로 프로비저닝할 단일 디바이스에 대한 개별 등록을 보여줍니다.

  1. Azure Portal에 로그인하고, Device Provisioning Service 인스턴스로 이동합니다.

  2. 탐색 메뉴의 설정 섹션에서 등록 관리를 선택합니다.

  3. 개별 등록 탭을 선택한 다음 개별 등록 추가를 선택합니다.

    Screenshot that shows the add individual enrollment option.

  4. 등록 추가 페이지의 등록 + 프로비전에서 다음 정보를 제공하여 등록 세부 정보를 구성합니다.

    필드 설명
    증명 증명 메커니즘으로 X.509 클라이언트 인증서를 선택합니다.
    X.509 인증서 설정 이 등록을 위해 디바이스를 확인하는 데 사용할 1 또는 2개의 인증서를 업로드합니다.
    프로비전 상태 이 등록을 사용하여 디바이스를 프로비전하려면 이 등록 사용하도록 설정 확인란을 선택합니다. 등록을 사용하지 않도록 설정하려면 이 상자를 선택 취소합니다. 이 설정은 나중에 변경할 수 있습니다.
    재프로비전 정책 DPS가 다시 프로비전을 요청하는 디바이스를 처리하는 방법을 반영하는 재프로비전 정책을 선택합니다. 자세한 내용은 다시 프로비전 정책을 참조하세요.
  5. 다음: IoT 허브를 선택합니다.

  6. 등록 추가 페이지의 IoT 허브 탭에서 다음 정보를 제공하여 등록이 디바이스를 프로비전할 수 있는 IoT 허브를 결정합니다.

    필드 설명
    대상 IoT 허브 연결된 IoT 허브 중 하나 이상을 선택하거나 IoT 허브에 새 링크를 추가합니다. DPS 인스턴스에 IoT 허브를 연결하는 방법에 대해 자세히 알아보려면 IoT 허브 연결 및 관리 방법을 참조하세요.
    할당 정책 둘 이상의 연결된 IoT 허브를 선택한 경우 디바이스를 다른 허브에 할당할 방법을 선택합니다. 할당 정책에 대한 자세한 내용은 할당 정책 사용 방법을 참조하세요.

    연결된 IoT 허브를 하나만 선택한 경우 동일 가중 배포 정책을 사용하는 것이 좋습니다.
  7. 다음: 디바이스 설정을 선택합니다

  8. 등록 추가 페이지의 디바이스 설정 탭에서 다음 정보를 제공하여 새로 프로비전된 디바이스를 구성하는 방법을 정의합니다.

    필드 설명
    디바이스 ID IoT Hub에서 프로비전된 디바이스에 할당될 디바이스 ID를 제공합니다. 디바이스 ID를 제공하지 않으면 등록 ID가 사용됩니다.
    IoT Edge 프로비전된 디바이스가 Azure IoT Edge를 실행할 경우 프로비전된 디바이스에서 IoT Edge 사용를 선택합니다. 이 등록이 IoT Edge 지원 디바이스가 아닌 경우 이 상자를 선택 취소합니다.
    디바이스 태그 이 텍스트 상자를 사용하여 프로비전된 디바이스의 디바이스 쌍에 적용할 태그를 제공합니다.
    원하는 속성 이 텍스트 상자를 사용하여 프로비전된 디바이스의 디바이스 쌍에 적용할 원하는 속성을 제공합니다.

    자세한 내용은 IoT Hub의 디바이스 쌍 이해 및 사용을 참조하세요.

  9. 완료되면 다음: 리뷰 + 만들기를 클릭합니다.

  10. 검토 + 만들기 탭에서 모든 값을 확인한 다음 만들기를 선택합니다.

디바이스 프로비저닝 코드 준비 및 실행

이 섹션에서는 디바이스의 부팅 시퀀스를 Device Provisioning Service 인스턴스에 보내도록 샘플 코드를 업데이트합니다. 이 부팅 시퀀스로 인해 디바이스가 인식되고 DPS 인스턴스에 연결된 IoT Hub에 할당됩니다.

이 섹션에서는 Git Bash 프롬프트와 Visual Studio IDE를 사용합니다.

프로비저닝 디바이스 코드 구성

이 섹션에서는 샘플 코드를 Device Provisioning Service 인스턴스 정보로 업데이트합니다.

  1. Azure Portal에서 Device Provisioning Service의 개요 탭을 선택합니다.

  2. ID 범위 값을 복사합니다.

    Screenshot of the ID scope on Azure portal.

  3. Visual Studio를 시작하고, azure-iot-sdk-c git 리포지토리의 루트에 만든 cmake 디렉터리에 생성된 새 솔루션 파일을 엽니다. 솔루션 파일의 이름은 azure_iot_sdks.sln입니다.

  4. Visual Studio의 솔루션 탐색기에서 Provision_Samples > prov_dev_client_sample > 원본 파일로 이동하여 prov_dev_client_sample.c를 엽니다.

  5. id_scope 상수를 찾고, 값을 2단계에서 복사한 ID 범위 값으로 바꿉니다.

    static const char* id_scope = "0ne00000A0A";
    
  6. 동일한 파일에서 main() 함수에 대한 정의를 찾습니다. hsm_type 변수가 SECURE_DEVICE_TYPE_X509로 설정되어 있는지 확인합니다.

    SECURE_DEVICE_TYPE hsm_type;
    //hsm_type = SECURE_DEVICE_TYPE_TPM;
    hsm_type = SECURE_DEVICE_TYPE_X509;
    //hsm_type = SECURE_DEVICE_TYPE_SYMMETRIC_KEY;
    
  7. 변경 내용을 저장합니다.

  8. prov_dev_client_sample 프로젝트를 마우스 오른쪽 단추로 클릭한 다음 시작 프로젝트로 설정을 선택합니다.

사용자 지정 HSM 스텁 코드 구성

실제 보안 하드웨어 기반 스토리지와 이루어지는 구체적인 상호 작용은 하드웨어에 따라 달라집니다. 결과적으로 이 빠른 시작에서 시뮬레이션된 디바이스에서 사용하는 인증서 및 프라이빗 키는 사용자 지정 HSM(하드웨어 보안 모듈) 스텁 코드에 하드코딩됩니다.

ID가 my-x509-device인 디바이스의 ID를 시뮬레이션하도록 사용자 지정 HSM 스텁 코드를 업데이트하려면 다음을 수행합니다.

  1. Visual Studio의 솔루션 탐색기에서 Provisioning_Samples > custom_hsm_example > 원본 파일로 이동하여 custom_hsm_example.c를 엽니다.

  2. 디바이스 인증서를 생성할 때 사용한 일반 이름을 사용하여 COMMON_NAME 문자열 상수의 문자열 값을 업데이트합니다. my-x509-device.

    static const char* const COMMON_NAME = "my-x509-device";
    
  3. 이전에 생성한 디바이스 인증서 device-cert.pem을 사용하여 CERTIFICATE 상수 문자열의 문자열 값을 업데이트합니다.

    샘플의 인증서 텍스트 구문은 추가 공백이나 Visual Studio에서 수행한 구문 분석 없이 다음 패턴을 따라야 합니다.

    static const char* const CERTIFICATE = "-----BEGIN CERTIFICATE-----\n"
    "MIIFOjCCAyKgAwIBAgIJAPzMa6s7mj7+MA0GCSqGSIb3DQEBCwUAMCoxKDAmBgNV\n"
        ...
    "MDMwWhcNMjAxMTIyMjEzMDMwWjAqMSgwJgYDVQQDDB9BenVyZSBJb1QgSHViIENB\n"
    "-----END CERTIFICATE-----";        
    

    이 문자열 값을 수동으로 업데이트하면 오류가 발생하기 쉽습니다. 올바른 구문을 생성하려면 다음 명령을 복사하여 Git Bash 프롬프트에 붙여넣고 ENTER를 누릅니다. 이 명령은 CERTIFICATE 문자열 상수 값에 대한 구문을 생성하고 출력에 씁니다.

    sed -e 's/^/"/;$ !s/$/""\\n"/;$ s/$/"/' device-cert.pem
    

    상수 값에 대한 출력 인증서 텍스트를 복사하여 붙여넣습니다.

  4. 디바이스 인증서 unencrypted-device-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-----";
    

    이 문자열 값을 수동으로 업데이트하면 오류가 발생하기 쉽습니다. 올바른 구문을 생성하려면 다음 명령을 복사하여 Git Bash 프롬프트에 붙여넣고 ENTER를 누릅니다. 이 명령은 PRIVATE_KEY 문자열 상수 값에 대한 구문을 생성하고 출력에 씁니다.

    sed -e 's/^/"/;$ !s/$/""\\n"/;$ s/$/"/' unencrypted-device-key.pem
    

    상수 값에 대한 출력 프라이빗 키 텍스트를 복사하여 붙여넣습니다.

  5. 변경 내용을 저장합니다.

  6. custom_hsm_-_example 프로젝트를 마우스 오른쪽 단추로 클릭하고 빌드를 선택합니다.

    Important

    다음 섹션에서 나머지 솔루션을 빌드하기 전에 custom_hsm_example 프로젝트를 빌드해야 합니다.

샘플 실행

  1. Visual Studio 메뉴에서 디버그>디버깅하지 않고 시작을 선택하여 솔루션을 실행합니다. 프로젝트를 다시 빌드하라는 메시지가 표시되면 실행하기 전에 를 선택하여 프로젝트를 다시 빌드합니다.

    다음 출력은 성공적으로 부팅되고 프로비전 서비스에 연결하는 my-x509-device 시뮬레이션된 디바이스에 대한 예입니다. 디바이스가 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-iot-hub-2.azure-devices.net, deviceId: my-x509-device
    Press enter key to exit:
    

이 섹션에서는 Windows 명령 프롬프트를 사용합니다.

  1. Azure Portal에서 Device Provisioning Service의 개요 탭을 선택합니다.

  2. ID 범위 값을 복사합니다.

    Screenshot of the ID scope on Azure portal.

  3. Windows 명령 프롬프트에서 X509Sample 디렉터리로 변경합니다. 이 디렉터리는 컴퓨터에서 샘플을 복제한 디렉터리의 .\azure-iot-sdk-csharp\provisioning\device\samples\getting started\X509Sample 디렉터리에 있습니다.

  4. 다음 명령을 입력하여 X.509 디바이스 프로비전 샘플을 빌드하고 실행합니다(<IDScope> 값을 이전 섹션에서 복사한 ID 범위로 바꾸기). 인증서 파일은 기본적으로 ./certificate.pfx로 설정되며 .pfx 암호를 입력하라는 메시지가 표시됩니다.

    dotnet run -- -s <IDScope>
    

    인증서와 암호를 매개 변수로 전달하려면 다음 형식을 사용할 수 있습니다.

    참고 항목

    애플리케이션을 실행하는 동안 추가 매개 변수를 전달하여 TransportType(-t) 및 GlobalDeviceEndpoint(-g)를 변경할 수 있습니다.

    dotnet run -- -s 0ne00000A0A -c certificate.pfx -p 1234
    
  5. 디바이스가 DPS에 연결되고 IoT 허브에 할당됩니다. 그런 다음 디바이스는 원격 분석 메시지를 IoT Hub로 보냅니다.

    Loading the certificate...
    Enter the PFX password for certificate.pfx:
    ****
    Found certificate: A33DB11B8883DEE5B1690ACFEAAB69E8E928080B CN=my-x509-device; PrivateKey: True
    Using certificate A33DB11B8883DEE5B1690ACFEAAB69E8E928080B CN=my-x509-device
    Initializing the device provisioning client...
    Initialized for registration Id my-x509-device.
    Registering with the device provisioning service...
    Registration status: Assigned.
    Device my-x509-device registered to MyExampleHub.azure-devices.net.
    Creating X509 authentication for IoT Hub...
    Testing the provisioned device with IoT Hub...
    Sending a telemetry message...
    Finished.
    

이 섹션에서는 Windows 명령 프롬프트를 사용합니다.

  1. Azure Portal에서 Device Provisioning Service의 개요 탭을 선택합니다.

  2. ID 범위 값을 복사합니다.

    Screenshot of the ID scope on Azure portal.

  3. Windows 명령 프롬프트에서 샘플 디렉터리로 이동하고 샘플에 필요한 패키지를 설치합니다. 표시된 경로는 SDK를 복제한 위치에 상대적입니다.

    cd .\azure-iot-sdk-node\provisioning\device\samples
    npm install
    

    이 샘플은 5개의 환경 변수를 사용하여 DPS를 사용하여 IoT 디바이스를 인증하고 프로비전합니다. 이러한 환경 변수는 다음과 같습니다.

    변수 이름 설명
    PROVISIONING_HOST DPS 인스턴스에 연결하는 데 사용할 엔드포인트입니다. 이 빠른 시작에서는 전역 엔드포인트 global.azure-devices-provisioning.net을 사용합니다.
    PROVISIONING_IDSCOPE DPS 인스턴스의 ID 범위입니다.
    PROVISIONING_REGISTRATION_ID 디바이스의 등록 ID입니다. 디바이스 인증서의 주체 일반 이름과 일치해야 합니다.
    CERTIFICATE_FILE 디바이스 인증서 파일의 경로입니다.
    KEY_FILE 디바이스 프라이빗 키 파일의 경로입니다.
  4. 전역 디바이스 엔드포인트 및 ID 범위에 대한 환경 변수를 추가합니다. <id-scope>를 2단계에서 복사한 값으로 바꿉니다.

    set PROVISIONING_HOST=global.azure-devices-provisioning.net
    set PROVISIONING_IDSCOPE=<id-scope>
    
  5. 디바이스 등록 ID에 대한 환경 변수를 설정합니다. IoT 디바이스의 등록 ID는 해당 디바이스 인증서의 주체 일반 이름과 일치해야 합니다. 이 빠른 시작의 단계에 따라 자체 서명된 테스트 인증서를 생성한 경우 my-x509-device는 디바이스의 주체 이름이자 등록 ID입니다.

    set PROVISIONING_REGISTRATION_ID=my-x509-device
    
  6. 디바이스 인증서 및(암호화되지 않은) 디바이스 프라이빗 키 파일에 대한 환경 변수를 설정합니다.

    set CERTIFICATE_FILE=.\device-cert.pem
    set KEY_FILE=.\unencrypted-device-key.pem
    
  7. 샘플을 실행하고 디바이스가 성공적으로 프로비전되었는지 확인합니다.

    node register_x509.js
    

    다음 예제와 비슷한 내용이 출력됩니다.

    registration succeeded
    assigned hub=contoso-hub-2.azure-devices.net
    deviceId=my-x509-device
    Client connected
    send status: MessageEnqueued
    

이 섹션에서는 Windows 명령 프롬프트를 사용합니다.

  1. Azure Portal에서 Device Provisioning Service의 개요 탭을 선택합니다.

  2. ID 범위전역 디바이스 엔드포인트 값을 복사합니다.

    Screenshot of the ID scope and global device endpoint on Azure portal.

  3. Windows 명령 프롬프트에서 provision_x509.py 샘플 디렉터리로 이동합니다. 표시된 경로는 SDK를 복제한 위치에 상대적입니다.

    cd ./azure-iot-sdk-python/samples/async-hub-scenarios
    

    이 샘플에서는 6개의 환경 변수를 사용하여 DPS를 사용하여 IoT 디바이스를 인증하고 프로비저닝합니다. 이러한 환경 변수는 다음과 같습니다.

    변수 이름 설명
    PROVISIONING_HOST DPS 인스턴스에 연결하는 데 사용되는 글로벌 엔드포인트입니다.
    PROVISIONING_IDSCOPE DPS 인스턴스의 ID 범위입니다.
    DPS_X509_REGISTRATION_ID 디바이스의 등록 ID입니다. 또한 디바이스 인증서의 주체 이름과 일치해야 합니다.
    X509_CERT_FILE 디바이스 인증서 파일의 경로입니다.
    X509_KEY_FILE 디바이스 인증서 프라이빗 키 파일의 경로입니다.
    PASS_PHRASE 인증서 및 프라이빗 키 파일(1234)을 암호화하는 데 사용된 암호입니다.
  4. 전역 디바이스 엔드포인트 및 ID 범위에 대한 환경 변수를 추가합니다.

    set PROVISIONING_HOST=global.azure-devices-provisioning.net
    set PROVISIONING_IDSCOPE=<ID scope for your DPS resource>
    
  5. 등록 ID에 대한 환경 변수를 설정합니다. IoT 디바이스의 등록 ID는 디바이스 인증서의 주체 이름과 일치해야 합니다. 이 빠른 시작의 단계에 따라 자체 서명된 테스트 인증서를 생성한 경우 my-x509-device는 디바이스의 주체 이름이자 등록 ID입니다.

    set DPS_X509_REGISTRATION_ID=my-x509-device
    
  6. 인증서 파일, 프라이빗 키 파일 및 암호에 대한 환경 변수를 설정합니다.

    set X509_CERT_FILE=./device-cert.pem
    set X509_KEY_FILE=./device-key.pem
    set PASS_PHRASE=1234
    
  7. provision_x509.py에 대한 코드를 검토합니다. Python 버전 3.7 이상을 사용하지 않는 경우 여기에 언급된 코드 변경을 수행하여 asyncio.run(main())을 바꾸고 변경 내용을 저장합니다.

  8. 예제를 실행합니다. 샘플은 디바이스를 IoT 허브에 프로비전하는 DPS에 연결합니다. 디바이스가 프로비전된 후 샘플은 일부 테스트 메시지를 IoT Hub로 보냅니다.

    $ python azure-iot-sdk-python/samples/async-hub-scenarios/provision_x509.py
    RegistrationStage(RequestAndResponseOperation): Op will transition into polling after interval 2.  Setting timer.
    The complete registration result is
    my-x509-device
    TestHub12345.azure-devices.net
    initialAssignment
    null
    Will send telemetry from the provisioned device
    sending message #4
    sending message #7
    sending message #2
    sending message #8
    sending message #5
    sending message #9
    sending message #1
    sending message #6
    sending message #10
    sending message #3
    done sending message #4
    done sending message #7
    done sending message #2
    done sending message #8
    done sending message #5
    done sending message #9
    done sending message #1
    done sending message #6
    done sending message #10
    done sending message #3
    

이 섹션에서는 Windows 명령 프롬프트와 Git Bash 프롬프트를 모두 사용합니다.

  1. Azure Portal에서 Device Provisioning Service의 개요 탭을 선택합니다.

  2. ID 범위전역 디바이스 엔드포인트 값을 복사합니다.

    Screenshot of the ID scope and global device endpoint on Azure portal.

  3. Windows 명령 프롬프트에서 샘플 프로젝트 폴더로 이동합니다. 표시된 경로는 SDK를 복제한 위치에 상대적입니다

    cd .\azure-iot-sdk-java\provisioning\provisioning-device-client-samples\provisioning-X509-sample
    
  4. 샘플 코드에 프로비전 서비스 및 X.509 ID 정보를 입력합니다. 이 정보는 디바이스 등록 전에 시뮬레이션된 디바이스의 증명을 위해 프로비전 중에 사용됩니다.

    1. 원하는 편집기에서 파일 .\src\main\java\samples\com\microsoft\azure\sdk\iot\ProvisioningX509Sample.java 열기

    2. 이전에 복사한 ID 범위Provisioning Service Global Endpoint로 다음 값을 업데이트합니다.

      private static final String idScope = "[Your ID scope here]";
      private static final String globalEndpoint = "[Your Provisioning Service Global Endpoint here]";
      private static final ProvisioningDeviceClientTransportProtocol PROVISIONING_DEVICE_CLIENT_TRANSPORT_PROTOCOL = ProvisioningDeviceClientTransportProtocol.HTTPS;
      
      
    3. leafPublicPem 상수 문자열의 값을 인증서 값 device-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/$/"/' device-cert.pem
      

      상수 값에 대한 출력 인증서 텍스트를 복사하여 붙여넣습니다.

    4. 디바이스 인증서 unencrypted-device-key.pem의 암호화되지 않은 프라이빗 키로 leafPrivateKey 상수의 문자열 값을 업데이트합니다.

      프라이빗 키 텍스트의 구문은 추가 공백이나 문자 없이 다음 패턴을 따라야 합니다.

      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/$/"/' unencrypted-device-key.pem
      

      상수 값에 대한 출력 프라이빗 키 텍스트를 복사하여 붙여넣습니다.

    5. 변경 내용을 저장합니다.

  5. 샘플을 빌드한 다음 target 폴더로 이동합니다.

    mvn clean install
    cd target
    
  6. 빌드는 target 폴더의 .jar 파일을 provisioning-x509-sample-{version}-with-deps.jar 파일 형식으로 출력합니다. 예: provisioning-x509-sample-1.8.1-with-deps.jar. .jar 파일을 실행합니다. 다음 명령에서 버전을 바꿔야 할 수도 있습니다.

    java -jar ./provisioning-x509-sample-1.8.1-with-deps.jar
    

    샘플은 디바이스를 IoT 허브에 프로비전하는 DPS에 연결합니다. 디바이스가 프로비전된 후 샘플은 일부 테스트 메시지를 IoT Hub로 보냅니다.

    Starting...
    Beginning setup.
    WARNING: sun.reflect.Reflection.getCallerClass is not supported. This will impact performance.
    2022-05-11 09:42:05,025 DEBUG (main) [com.microsoft.azure.sdk.iot.provisioning.device.ProvisioningDeviceClient] - Initialized a ProvisioningDeviceClient instance using SDK version 2.0.0
    2022-05-11 09:42:05,027 DEBUG (main) [com.microsoft.azure.sdk.iot.provisioning.device.ProvisioningDeviceClient] - Starting provisioning thread...
    Waiting for Provisioning Service to register
    2022-05-11 09:42:05,030 INFO (global.azure-devices-provisioning.net-6255a8ba-CxnPendingConnectionId-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Opening the connection to device provisioning service...
    2022-05-11 09:42:05,252 INFO (global.azure-devices-provisioning.net-6255a8ba-Cxn6255a8ba-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-05-11 09:42:05,286 INFO (global.azure-devices-provisioning.net-6255a8ba-Cxn6255a8ba-azure-iot-sdk-RegisterTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.RegisterTask] - Authenticating with device provisioning service using x509 certificates
    2022-05-11 09:42:06,083 INFO (global.azure-devices-provisioning.net-6255a8ba-Cxn6255a8ba-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Waiting for device provisioning service to provision this device...
    2022-05-11 09:42:06,083 INFO (global.azure-devices-provisioning.net-6255a8ba-Cxn6255a8ba-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Current provisioning status: ASSIGNING
    Waiting for Provisioning Service to register
    2022-05-11 09:42:15,685 INFO (global.azure-devices-provisioning.net-6255a8ba-Cxn6255a8ba-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Device provisioning service assigned the device successfully
    IotHUb Uri : MyExampleHub.azure-devices.net
    Device ID : java-device-01
    2022-05-11 09:42:25,057 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-05-11 09:42:25,080 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-05-11 09:42:25,087 DEBUG (main) [com.microsoft.azure.sdk.iot.device.DeviceClient] - Initialized a DeviceClient instance using SDK version 2.0.3
    2022-05-11 09:42:25,129 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.MqttIotHubConnection] - Opening MQTT connection...
    2022-05-11 09:42:25,150 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sending MQTT CONNECT packet...
    2022-05-11 09:42:25,982 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sent MQTT CONNECT packet was acknowledged
    2022-05-11 09:42:25,983 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sending MQTT SUBSCRIBE packet for topic devices/java-device-01/messages/devicebound/#
    2022-05-11 09:42:26,068 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sent MQTT SUBSCRIBE packet for topic devices/java-device-01/messages/devicebound/# was acknowledged
    2022-05-11 09:42:26,068 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.MqttIotHubConnection] - MQTT connection opened successfully
    2022-05-11 09:42:26,070 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - The connection to the IoT Hub has been established
    2022-05-11 09:42:26,071 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Updating transport status to new status CONNECTED with reason CONNECTION_OK
    2022-05-11 09:42:26,071 DEBUG (main) [com.microsoft.azure.sdk.iot.device.DeviceIO] - Starting worker threads
    2022-05-11 09:42:26,073 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Invoking connection status callbacks with new status details
    2022-05-11 09:42:26,074 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Client connection opened successfully
    2022-05-11 09:42:26,075 INFO (main) [com.microsoft.azure.sdk.iot.device.DeviceClient] - Device client opened successfully
    Sending message from device to IoT Hub...
    2022-05-11 09:42:26,077 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Message was queued to be sent later ( Message details: Correlation Id [54d9c6b5-3da9-49fe-9343-caa6864f9a02] Message Id [28069a3d-f6be-4274-a48b-1ee539524eeb] )
    Press any key to exit...
    2022-05-11 09:42:26,079 DEBUG (MyExampleHub.azure-devices.net-java-device-01-ee6c362d-Cxn7a1fb819-e46d-4658-9b03-ca50c88c0440-azure-iot-sdk-IotHubSendTask) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Sending message ( Message details: Correlation Id [54d9c6b5-3da9-49fe-9343-caa6864f9a02] Message Id [28069a3d-f6be-4274-a48b-1ee539524eeb] )
    2022-05-11 09:42:26,422 DEBUG (MQTT Call: java-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 [54d9c6b5-3da9-49fe-9343-caa6864f9a02] Message Id [28069a3d-f6be-4274-a48b-1ee539524eeb] )
    2022-05-11 09:42:26,425 DEBUG (MyExampleHub.azure-devices.net-java-device-01-ee6c362d-Cxn7a1fb819-e46d-4658-9b03-ca50c88c0440-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 [54d9c6b5-3da9-49fe-9343-caa6864f9a02] Message Id [28069a3d-f6be-4274-a48b-1ee539524eeb] ) with status OK
    Message sent!
    

디바이스 프로비저닝 등록 확인

디바이스가 프로비전된 IoT 허브를 확인하려면 이전에 만든 개별 등록의 등록 세부 정보를 확인합니다.

  1. Azure Portal에서 Device Provisioning Service로 이동합니다.

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

  3. 개별 등록을 선택합니다. 이전에 만든 X.509 등록 항목인 my-x509-device가 목록에 나타나야 합니다.

  4. 등록 항목을 선택합니다. 디바이스가 할당된 IoT Hub와 디바이스 ID가 등록 상태 아래에 나타납니다.

IoT 허브에서 디바이스를 확인하려면:

  1. Azure Portal에서 디바이스가 할당된 IoT Hub로 이동합니다.

  2. 디바이스 관리 메뉴에서 디바이스를 선택합니다.

  3. 디바이스가 성공적으로 프로비전된 경우 디바이스 ID my-x509-device상태사용으로 설정된 상태로 목록에 표시되어야 합니다. 디바이스가 표시되지 않으면 새로 고침을 선택합니다.

    Screenshot that shows the device is registered with the IoT hub in Azure portal.

Important

디바이스에 대한 등록 항목의 기본값으로부터 초기 디바이스 쌍 상태를 변경한 경우, 허브에서 원하는 쌍 상태를 가져와서 그에 맞게 작동할 수 있습니다. 자세한 내용은 IoT Hub의 디바이스 쌍 이해 및 사용을 참조하세요.

리소스 정리

디바이스 클라이언트 샘플을 계속해서 작업하고 검색할 계획인 경우 이 빠른 시작에서 만든 리소스를 정리하지 마세요. 그만하려면 다음 단계를 사용하여 이 빠른 시작에서 만든 모든 리소스를 삭제합니다.

디바이스 등록 삭제

  1. 컴퓨터에서 디바이스 클라이언트 샘플 출력 창을 닫습니다.

  2. Azure Portal의 왼쪽 메뉴에서 모든 리소스를 선택합니다.

  3. Device Provisioning Service를 선택합니다.

  4. 설정 메뉴에서 등록 관리를 선택합니다.

  5. 개별 등록 탭을 선택합니다.

  6. 이 빠른 시작에 등록한 디바이스의 등록 ID 옆에 있는 확인란을 선택합니다.

  7. 페이지 위쪽에서 삭제를 선택합니다.

IoT Hub에서 디바이스 등록 삭제

  1. Azure Portal의 왼쪽 메뉴에서 모든 리소스를 선택합니다.

  2. IoT Hub를 선택합니다.

  3. Explorers 메뉴에서 IoT 디바이스를 선택합니다.

  4. 이 빠른 시작에서 등록한 디바이스의 디바이스 ID 옆에 있는 확인란을 선택합니다.

  5. 페이지 위쪽에서 삭제를 선택합니다.

다음 단계

이 빠른 시작에서는 개별 등록을 사용하여 단일 디바이스를 IoT Hub에 프로비전했습니다. 다음으로, 여러 허브에서 여러 디바이스를 프로비전하는 방법을 알아봅니다.