Develop Note

[W5100S-EVB-Pico] X.509 인증서를 사용하여 Azure IoT Central에 연결하기 본문

개발 (Ko)

[W5100S-EVB-Pico] X.509 인증서를 사용하여 Azure IoT Central에 연결하기

Chalsu 2022. 1. 7. 11:50

WIZnet의 W5100S-EVB-Pico 보드를 사용하여 Azure IoT Central에 X.509 인증서로 연동하는 내용을 정리해 본다.

W5100S-EVB-Pico는 Raspberry Pi에서 최근 출시된 RP2040 microcontroller chip과 WIZnet의 Ethernet chip인 W5100S를 기반으로 하는 Evaluation 보드이다.

Raspberry Pi Pico 플랫폼과 동일한 환경으로 개발할 수 있고, W5100S을 통해 이더넷을 사용할 수 있다. 디바이스에 대한 정보는 아래 링크에서 참조할 수 있다.

하드웨어 연결

하드웨어 연결 방법은 간단하다.

W5100S-EVB-Pico에 전원을 공급하기 위해 micro 5 pin 케이블을 연결하고(이는 USB debug port로도 사용된다), 네트워크를 사용하기 위해 이더넷 케이블을 사용해서 DHCP 서버를 지원하는 AP(공유기)로 연결했다.

개발 환경 설정 (Windows 10, VS Code)

개발 환경 셋업에 대한 정보는 공식 문서(Getting Started Guide)에 잘 설명되어 있다. 문서 내용 중, Windows 및 Visual Studio Code 환경 부분을 참조했다.

문서는 아래 링크에서 참조할 수 있다.

개발 환경 구성에 대한 내용은 가이드 문서에 잘 설명되어 있으니 자신의 개발 환경에 맞게 따라가면 된다.

한가지 체크할 사항은 Visual Studio 2019의 Build Tool을 설치하고 사용하는 것인데, VS Code를 VS Command Prompt를 통해 실행하면 관련 tool을 사용할 수 있게 된다.

처음에 이 부분을 확인하지 못하고 빌드를 시도했는데 계속 실패해서 다시 가이드를 정독하고 내용을 적용했었다.

Visual Studio Build Tools 설치가 선행되어야 한다.

Run VS Code with Developer Command Prompt

Visual Studio의 빌드 환경을 사용하기 위해 다음과 같이 진행한다.

Developer Command Prompt for VS 2019를 열고,

'code' command를 입력하여 Visual Studio Code를 입력한다.

이 과정을 통해 VS Code를 실행하면 빌드 시 필요한 환경들을 사용할 수 있다.

This will open Visual Studio Code with all the correct environment variables set so that the toolchain is correctly configured.

VS Code settings

VS Code 설정에서 빌드하기 위해 다음과 같이 cmake와 Pico SDK 경로 설정을 해 주었다.

"cmake.cmakePath": "C:\\Program Files\\CMake\\bin\\cmake.exe",
"cmake.configureSettings": {
    "PICO_SDK_PATH": "D:\\_RaspberryPi_Pico\\pico-sdk"
},

2022.03.24
누락된 내용이 있어 추가한다. (PC 개발환경에 따라 다를 수 있다)

  • PICO_TOOLCHAIN_PATH

      // settings for Azure sphere (CMake)
      "cmake.cmakePath": "C:\\Program Files\\CMake\\bin\\cmake.exe",
      "cmake.configureSettings": {
          // RPI Pico settings
          "PICO_SDK_PATH": "D:\\_Project\\_RaspberryPi_Pico\\pico-sdk",
          "PICO_TOOLCHAIN_PATH": "C:\\Program Files (x86)\\GNU Arm Embedded Toolchain\\10 2021.10\\bin"
      },
      // RPI Pico settings
      "cmake.generator": "NMake Makefiles",

Repository

코드는 WIZnet 공식 Github페이지에서 제공하는 RP2040-HAT-AZURE-C 프로젝트를 사용했다.

git clone 명령을 사용하여 프로젝트를 로컬 PC로 clone 한다.

git clone https://github.com/Wiznet/RP2040-HAT-AZURE-C

VS Code에서 Open Folder 메뉴를 통해 프로젝트 디렉토리를 오픈한다. (Developer Command Prompt를 통해 VS code를 실행한 상태이다)****

IoT Central application 설정

IoT Central 체험 플랜(7일) 사용 시 Azure 구독 없이도 어플리케이션을 생성 및 사용할 수 있다.

7일 이후에는 Azure 구독이 필요하다. 자세한 내용은 MS Azure 매뉴얼에서 참조할 수 있다.

관리 웹 환경 디바이스 관리 디바이스 데이터 보기 및 분석 데이터와 디바이스 보호

apps.azureiotcentral.com](https://apps.azureiotcentral.com/)

가이드를 참조하여 Azure IoT Central 어플리케이션을 생성하도록 한다.

Create certificates (with openSSL)

디바이스 인증에 사용할 X.509 인증서를 생성한다. 인증서를 생성하기 위해 OpenSSL을 사용했으며, 아래 가이드 문서를 참조했다.

아래 인증서들을 생성하고, IoT Central application 및 디바이스 코드에 등록할 예정이다.

Root CA와 Sub CA 생성에 사용되는 .conf 파일은 가이드 내에 있는 내용을 그대로 사용하고, 이름만 변경했다.

  • Root CA
  • Subordinate CA
  • Device certificates

Root CA 설정 및 생성

  • Root CA 디렉터리 구조 생성
  • Conf 파일 생성
  • 인증서 생성
~$ mkdir rootca
~$ cd rootca/
~/rootca$ mkdir certs db private

~/rootca$ touch db/index
~/rootca$ openssl rand -hex 16 > db/serial
~/rootca$ echo 1001 > db/crlnumber

**# 인증서 이름 변경 (commonName)**
~/subca$ vi rootca.conf

~/rootca$ openssl req -new -config rootca.conf -out rootca.csr -keyout private/rootca.key
~/rootca$ openssl ca -selfsign -config rootca.conf -in rootca.csr -out rootca.crt -extensions ca_ext

Sub ca 설정 및 생성

하위 인증서를 설정하고 생성한다.

~/rootca$ cd ..
~$ ls
~$ mkdir subca
~$ cd subca/
~/subca$ mkdir certs db private
~/subca$ touch db/index
~/subca$ openssl rand -hex 16 > db/serial
~/subca$ echo 1001 > db/crlnumber

**# 인증서 이름 변경 (commonName 값 수정)**
~/subca$ vi subca.conf

~/subca$ openssl rand -hex 16 > ../rootca/db/serial
~/subca$ openssl req -new -config subca.conf -out subca.csr -keyout private/subca.key
~/subca$ openssl ca -config ../rootca/rootca.conf -in subca.csr -out subca.crt -extensions sub_ca_ext

Proof of possession (verify certificate)

앞서 생성한 인증서를 IoT Central에 등록하고 verify 하는 과정이 필요하다.

Root 인증서를 직접 사용해도 되지만, 여기에서는 하위 인증서를 사용하여 인증한다.

IoT Central 그룹 등록

new 버튼 클릭 → Create new enrollment group

  • Name: 식별 가능한 이름으로 지정
  • Attestation type: Certificates (X.509)

Save 버튼을 눌러 저장하면, 하단에 인증서를 등록할 수 있는 화면이 나온다.

Manage primary 버튼 클릭 후, 폴더 모양의 아이콘을 클릭하여 인증서를 업로드한다.

subca.crt 업로드

Generate verification code 버튼을 클릭해 확인 코드를 생성하고 복사한다.

openssl을 사용하여 verify 인증서를 생성한다. 이 때 생성된 확인 코드를 입력한다.

~/subca$ openssl genpkey -out pop.key -algorithm RSA -pkeyopt rsa_keygen_bits:2048
~/subca$ openssl req -new -key pop.key -out pop.csr

**** Common Name에 확인 코드 붙여넣기**

~/subca$ openssl ca -config subca.conf -in pop.csr -out pop.crt -extensions client_ext

Verify 버튼을 클릭 후 나타난 파일 선택 팝업 창에서 생성한 verfiy 인증서를 선택한다.

(파일이 안 보인다면 모든 파일 보기 옵션으로 선택)

소유 증명이 완료되면, 위 화면과 같이 Verified 상태로 변경된다.

이제 그룹 등록은 완료되었으니 디바이스에서 사용할 인증서를 생성한다.

Device cert

  • 디바이스 인증서를 생성한다.
  • Common Name 입력 시 사용할 Device ID를 입력한다.
$ openssl genpkey -out device.key -algorithm RSA -pkeyopt rsa_keygen_bits:2048
$ openssl req -new -key device.key -out device.csr

**--> Common Name (e.g. server FQDN or YOUR name) []: w5100s-evb-pico-01 입력**

$ openssl req -text -in device.csr -noout
$ openssl ca -config subca.conf -in device.csr -out device.crt -extensions client_ext

코드 작성 과정에서 디바이스 인증서 파일을 변수로 만들어 추가할 것이다.

Build and Run

어플리케이션 코드를 일부 수정하고 실행한다.

main.c

main 코드에서 사용할 예제 어플리케이션을 설정한다.

X.509 인증서로 프로비저닝을 할 것이기 때문에 APP_PROV_X509로 정의한다.

// The application you wish to use should be uncommented
//
// #define APP_TELEMETRY
//#define APP_C2D
//#define APP_CLI_X509
#define APP_PROV_X509

sample_certs.c

생성한 디바이스 인증서를 sample_certs.c에 변수로 추가해야 한다.

IoT Central X.509 인증서 인증으로 연결하기 위해 사용할 변수는 다음과 같다.

변수 인증서
pico_az_CERTIFICATE device.crt 인증서
pico_az_PRIVATE_KEY device.key 인증서
pico_az_id_scope IoT Central ID scope
pico_az_COMMON_NAME 디바이스 ID

pico_az_COMMON_NAME는 디바이스 인증서 생성 시 적었던 Common Name과 동일한 값을 사용한다.

인증서 파일을 변수로 변환 (Bash shell)

인증서 값을 디바이스 소스 코드 내 변수로 추가하기 위해서 변수 형태로 값을 변환해야 한다.

VS Code로 파일을 열어 직접 편집해도 무방하지만 매번 파일을 수정하려면 번거롭기 때문에 MS 가이드에서 제공하는 스크립트를 활용했다.

내용은 아래 링크에서 확인할 수 있다.

스크립트에서 input 부분을 대상 파일명으로 변경하고 shell에 그대로 붙여넣으면 변수 형태의 결과값이 출력되는데, path를 파라미터로 변경하기 위해 input 부분만 변경했다.

Vim으로 스크립트 파일(.sh)을 작성 후 사용한다.

인증서 변환 스크립트 작성

$ vi convert_cert.sh

input=$1
bContinue=true
prev=
while $bContinue; do
    if read -r next; then
      if [ -n "$prev" ]; then   
        echo "\"$prev\\n\""
      fi
      prev=$next  
    else
      echo "\"$prev\";"
      bContinue=false
    fi  
done < "$input"

스크립트 실행

$ chmod +x convert_cert.sh
$ ./convert_cert.sh <Certificate path>

key 파일도 동일한 방식으로 변환한다.

파일 작성

sample_cert.c 파일에 각각 해당하는 값들을 넣어 준다.

const char pico_az_id_scope[] = "<ID Scope>";

const char pico_az_COMMON_NAME[] = "w5100s-evb-pico-01";

const char pico_az_CERTIFICATE[] = 
"-----BEGIN CERTIFICATE-----\n"
"MIIDQDCCAiigAwIBAgIPAoh1JOyCoN2l8TasygP2MA0GCSqGSIb3DQEBCwUAMCUx\n"
...
"3agwSktbbJYEpQt2sZrdgIf5V3RsZH2/wZtLBBiVFismcVVEgY2qnBQXNxyQcc0z\n"
"9Vz3OITjhrWKTMkF0l/TNiy4eEU=\n"
"-----END CERTIFICATE-----";

const char pico_az_PRIVATE_KEY[] = 
"-----BEGIN PRIVATE KEY-----\n"
"MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDpHayE/0vdXbp2\n"
...
"W10KeONpLN+MyMr0fDgsHb6Bc5Re/S4s+CgprfvxiHLgQSFlb1wfCXG3xvuqgJk+\n"
"vrEySFLI2uifS0f64HLVtAPe\n"
"-----END PRIVATE KEY-----";

Build

VS Code 하단 Build 버튼을 클릭하거나, 단축키 F7을 눌러 빌드한다.

첫 빌드 시 완료까지 몇 분정도 소요될 수 있다.

[main] Building folder: RP2040-HAT-AZURE-C 
[build] Starting build
[proc] Executing command: "C:\Program Files\CMake\bin\cmake.exe" --build d:/_RaspberryPi_Pico/RP2040-HAT-AZURE-C/build --config Debug --target all -j 10 --
[build] Warning: NMake does not support parallel builds. Ignoring parallel build command line option.
[build] [  0%] Built target bs2_default
[build] [  1%] Built target bs2_default_padded_checksummed_asm
[build] [ 12%] Built target mbedcrypto
...
...
[build] [ 97%] Built target LOOPBACK_FILES
[build] [ 97%] Built target FTPSERVER_FILES
[build] [ 98%] Built target HTTPSERVER_FILES
[build] [100%] Built target MQTT_FILES
[build] Build finished with exit code 0

Run with W5100S-EVB-Pico

빌드가 성공적으로 완료되면, build 디렉터리에 결과물이 생성된다.

W5100S-EVB-Pico에서 사용할 펌웨어는 main.uf2 파일이다.

Firmware 업로드

다음 과정을 통해 장치로 펌웨어를 복사한다.

  • W5100S-EVB-Pico의 BOOTSEL 버튼을 누른 상태로 전원을 인가하여 Storage mode로 만든다.
    • Mode에 정상적으로 진입했다면 RPI-RP2라는 이름의 장치 드라이브가 나타난다. (Windows 환경)
  • main.uf2 파일을 드라이브 최상위 경로로 복사한다.
  • 장치는 자동으로 재시작된다.

IoT Central에서 생성된 디바이스 확인

디바이스 생성 확인

예제 코드에서 전송된 샘플 데이터 확인

장치 로그 모니터링

Terra Term, Putty 등의 터미널 프로그램을 사용하여 디바이스 동작 상태를 모니터링 할 수 있다.

Windows 장치 관리자에서 W5100S-EVB-Pico에 해당하는 COM port 번호를 확인하고, 터미널 프로그램에서 해당 port를 설정하여 연결한다.

Terra Term의 경우 다음과 같이 설정하여 연결하면 된다.

)

Comments