상세 컨텐츠

본문 제목

[RP2040] RP2040으로 Azure IoT Central 서비스 활용하기 with W5100S_EVB_PICO

RP2040

by 잡기장 2022. 2. 9. 18:48

본문

 

GitHub - Wiznet/RP2040-HAT-AZURE-C: Azure IoT SDK Example for RP2040

Azure IoT SDK Example for RP2040. Contribute to Wiznet/RP2040-HAT-AZURE-C development by creating an account on GitHub.

github.com


 

목차

  1. W5100S_EVB_PICO based on RP2040 소개
  2. W5100S_EVB_PICO 개발환경 설정
  3. Azure IoT Central 소개 및 설정
  4. 보안기반 통신을 위한 X.509 인증서 생성
  5. 인증서 적용 및 IoT 디바이스 접속
  6. Data 전송 가이드
  7. Azure IoT Central 대시보드 구성 가이드

 

 
 

메인 MCU를 RP2040으로 설계된 W5100S_EVB_PICO 보드를 통해서 Azure의 통합 IoT 서비스인 Azure IoT Central에 접속하고 이를 통해 IoT 디바이스의 데이터를 대시보드에 표시하는 서비스를 사용할 수 있습니다.

 

Azure IoT Central은 MS Azure에서 만든 IoT 통합 서비스로 디바이스의 보안연결, 데이터 수집, 분석, 대시보드 및 서비스 확장의 기능을 포함하고 있으며 이를 통해 사용자는 손쉽게 Azure IoT의 여러 서비스를 체험해볼 수 있습니다.

 

IoT 보안 통신을 위해서 디바이스는 X.509 인증서를 사용하여 Azure IoT Central과 인증서 기반의 통신을 하도록 구현되며 내용에서 openssl 을 통한 self-signed root ca 생성방법 가이드를 통해 만들 수 있습니다.

 


 
 

 

1. W5100S_EVB_PICO based on RP2040 소개

W5100S_EVB_PICO 보드는 RP2040을 메인 MCU 로 사용하고 있으며 WIZnet의 W5100S 칩 및 Ethernet RJ45를 온보드하여 사용자가 별도의 하드웨어 구성없이 Ethernet 통신을 사용할 수 있도록 구현된 보드입니다.

 

W5100S_EVB_PICO는 Azure 이외에도 AWS IoT Core Querified 를 획득하여 사용자에게 AWS 및 Azure의 빠른 접속 서비스를 제공하고 있습니다.

W5100S_EVB_PICO의 자세한 내용은 링크를 통해서 확인할 수 있습니다.

 


 

  

2. W5100S_EVB_PICO 환경설정

W5100S_EVB_PICO 환경설정은 RP2040의 개발 환경설정과 동일합니다. RP2040의 개발 환경은 특히 Window OS에서 많은 설치 프로그램을 요구합니다.

 

링크를 통해 Window OS 환경에서의 개발 환경설정 가이드를 자세하게 확인할 수 있습니다.

 


 

  

3. Azure IoT Central 소개

Azure IoT Central은 앞서 소개한대로 Azure에서 개발한 IoT 통합 서비스 환경입니다. Azure는 사용자로 하여금 Azure IoT Central을 통해 원하는 어플리케이션을 빠르게 구축 및 서비스할 수 있도록 하드웨어, 데이터 포맷에서 부터 서비스 구성 및 확장 서비스등의 레퍼런스를 제안하고 있습니다.

 
MS Azure IoT Central 주요 서비스

 

Azure IoT Central의 추가 소개 및 가격 가이드등의 내용은 링크를 통해 확인할 수 있습니다.

 


 

 

4. Azure IoT Central 서비스 생성

Azure IoT Central을 사용하려면 먼저 Azure 계정 을 통해 IoT Central 서비스를 신규생성합니다. 생성과정에서 몇 가지 필수사항을 기재하면 쉽게 IoT Central 서비스를 생성할 수 있으며 서비스 종류에 대해서는 Central 가격 가이드를 통해 디바이스를 통해 전송하려는 데이터 횟수를 기반으로 서비스 규모를 선택하면 됩니다.

 

  • Azure portal에서 IoT Central 검색
  • Azure IoT Central 신규생성
  • 필수정보 입력

Azure IoT Central 서비스 생성

 


 

 

5.  X.509 인증서 생성

Azure IoT Central을 생성했으며 이제 IoT 디바이스와 IoT Central간의 보안통신을 위한 X.509 인증서를 생성 및 등록해야 합니다. X.509 인증서는 openssl을 통해서 self-signed Root 인증서를 생성할 수 있습니다.

아래는 Microsoft에서 가이드하는 openssl을 활용한 Root CA 및 Sub CA 인증서 생성 방법 가이드입니다. 해당 가이드는 Linux OS 기반의 설명이므로 몇 가지 주의 사항이 있습니다.

 

MS Azure 자습서: OpenSSL을 사용하여 테스트 인증서 만들기

 

 

5-1. 인증서 생성을 위한 Root CA 디렉토리 구성

mkdir rootca
cd rootca
mkdir certs db private
touch db/index
openssl rand -hex 16 > db/serial
echo 1001 > db/crlnumber

 

해당 디렉토리 구성시 touch db/index 는 Window OS에 없는 명령어 입니다. 따라서 해당 내용을 수행하려면 생성된 db폴더에서 index라는 이름의 파일을 직접 생성하면 됩니다.

 

Window OS에서 touch 명령어에 대응하는 fsutil을 사용하는 경우 명령어 옵션에 의해 나중에 인증서 생성시 문제가 될 수 있습니다.

 

index 파일을 직접생성

 

5-2. Root CA 구성 파일 만들기

생성된 rootca/ 폴더에  rootca.conf  파일을 생성하고 아래 내용을 복사 붙여넣기 합니다.  commonName 의 경우에는 Root CA의 이름이므로 원하는 임의로 이름으로 변경할 수 있습니다.

[default]
name                     = rootca
domain_suffix            = example.com
aia_url                  = http://$name.$domain_suffix/$name.crt
crl_url                  = http://$name.$domain_suffix/$name.crl
default_ca               = ca_default
name_opt                 = utf8,esc_ctrl,multiline,lname,align

[ca_dn]
commonName               = "Test Root CA"

[ca_default]
home                     = ../rootca 
database                 = $home/db/index
serial                   = $home/db/serial
crlnumber                = $home/db/crlnumber
certificate              = $home/$name.crt
private_key              = $home/private/$name.key
RANDFILE                 = $home/private/random
new_certs_dir            = $home/certs
unique_subject           = no
copy_extensions          = none
default_days             = 3650
default_crl_days         = 365
default_md               = sha256
policy                   = policy_c_o_match

[policy_c_o_match]
countryName              = optional
stateOrProvinceName      = optional
organizationName         = optional
organizationalUnitName   = optional
commonName               = supplied
emailAddress             = optional

[req]
default_bits             = 2048
encrypt_key              = yes
default_md               = sha256
utf8                     = yes
string_mask              = utf8only
prompt                   = no
distinguished_name       = ca_dn
req_extensions           = ca_ext

[ca_ext]
basicConstraints         = critical,CA:true
keyUsage                 = critical,keyCertSign,cRLSign
subjectKeyIdentifier     = hash

[sub_ca_ext]
authorityKeyIdentifier   = keyid:always
basicConstraints         = critical,CA:true,pathlen:0
extendedKeyUsage         = clientAuth,serverAuth
keyUsage                 = critical,keyCertSign,cRLSign
subjectKeyIdentifier     = hash

[client_ext]
authorityKeyIdentifier   = keyid:always
basicConstraints         = critical,CA:false
extendedKeyUsage         = clientAuth
keyUsage                 = critical,digitalSignature
subjectKeyIdentifier     = hash

 

 

5-3. Root CA 인증서 생성

아래의 openssl 명령어를 통해 Root CA의 인증서 및 private key 를 생성하고 이를 확인합니다.

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

Root CA 생성

 

5-4. Sub CA 디렉터리 구조 만들기

Root CA 디렉토리 생성과 동일하게 touch db/index 는 Window OS에 없는 명령어 입니다. 따라서 해당 내용을 수행하려면 생성된 db폴더에서 index라는 이름의 파일을 직접 생성하면 됩니다.

Window OS에서 touch 명령어에 대응하는 fsutil을 사용하는 경우 명령어 옵션에 의해 나중에 인증서 생성시 문제가 될 수 있습니다.

mkdir subca
cd subca
mkdir certs db private
touch db/index
openssl rand -hex 16 > db/serial
echo 1001 > db/crlnumber

 

5-5. Sub CA 구성 파일 만들기

생성된 subca/ 폴더에  rootca.conf  파일을 생성하고 아래 내용을 복사 붙여넣기 합니다.  commonName 의 경우에는 Sub CA의 이름이므로 원하는 임의로 이름으로 변경할 수 있습니다. (Root CA 이름과 별도의 이름으로 생성합니다.)

[default]
name                     = subca
domain_suffix            = example.com
aia_url                  = http://$name.$domain_suffix/$name.crt
crl_url                  = http://$name.$domain_suffix/$name.crl
default_ca               = ca_default
name_opt                 = utf8,esc_ctrl,multiline,lname,align

[ca_dn]
commonName               = "Test Subordinate CA"

[ca_default]
home                     = . 
database                 = $home/db/index
serial                   = $home/db/serial
crlnumber                = $home/db/crlnumber
certificate              = $home/$name.crt
private_key              = $home/private/$name.key
RANDFILE                 = $home/private/random
new_certs_dir            = $home/certs
unique_subject           = no
copy_extensions          = copy 
default_days             = 365
default_crl_days         = 90 
default_md               = sha256
policy                   = policy_c_o_match

[policy_c_o_match]
countryName              = optional
stateOrProvinceName      = optional
organizationName         = optional
organizationalUnitName   = optional
commonName               = supplied
emailAddress             = optional

[req]
default_bits             = 2048
encrypt_key              = yes
default_md               = sha256
utf8                     = yes
string_mask              = utf8only
prompt                   = no
distinguished_name       = ca_dn
req_extensions           = ca_ext

[ca_ext]
basicConstraints         = critical,CA:true
keyUsage                 = critical,keyCertSign,cRLSign
subjectKeyIdentifier     = hash

[sub_ca_ext]
authorityKeyIdentifier   = keyid:always
basicConstraints         = critical,CA:true,pathlen:0
extendedKeyUsage         = clientAuth,serverAuth
keyUsage                 = critical,keyCertSign,cRLSign
subjectKeyIdentifier     = hash

[client_ext]
authorityKeyIdentifier   = keyid:always
basicConstraints         = critical,CA:false
extendedKeyUsage         = clientAuth
keyUsage                 = critical,digitalSignature
subjectKeyIdentifier     = hash

 

 

5-6. Sub CA 인증서 생성

아래의 openssl 명령어를 통해 Sub CA의 인증서 및 private key 를 생성하고 이를 확인합니다.

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

 

 


 

 

6. 인증서 기반 디바이스 접속 가이드

생성된 Sub CA 인증서를  Azure IoT Central에 등록하고 이를 사용해 IoT 디바이스용 인증서 및 Key를 를 생성할 수 있습니다.

  • Azure IoT Central에 Sub CA 인증서 등록
  • IoT 디바이스용 인증서 생성
  • Firmware에 디바이스용 인증서 파일 적용
  • Build and Run

 

6-1. Azure IoT Central에 Sub CA 인증서 등록

Azure portal을 통해 생성한 Azure IoT Central의 링크를 통해 해당 서비스 접속하여 왼쪽 사이드바 메뉴를 통해  Administration > Device connection  메뉴로 이동합니다.

새로운 Device Enrollment group 을 생성하고 openssl을 통해 생성한 Sub CA를 등록합니다.

Azure IoT Central에서 Sub CA 등록

 

Sub CA 인증서를 등록하면 이를 증명할 추가 인증서를 요구하는데 이때 사용되는 것이 Verification Code 입니다. 먼저 Sub CA 를 등록한 탑업창에서  Verification Code 를 생성하고 이를 복사합니다.

복사된 코드는 아래 명령어를 수행하면서  Common Name 파트에 복사합니다.

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

  -----
  Country Name (2 letter code) [XX]:.
  State or Province Name (full name) []:.
  Locality Name (eg, city) [Default City]:.
  Organization Name (eg, company) [Default Company Ltd]:.
  Organizational Unit Name (eg, section) []:.
  Common Name (eg, your name or your server hostname) []:BB0C656E69AF75E3FB3C8D922C1760C58C1DA5B05AAA9D0A
  Email Address []:

  Please enter the following 'extra' attributes
  to be sent with your certificate request
  A challenge password []:
  An optional company name []:

 

마지막으로 Verification Code 를 통해 인증서를 증명할 파일을 생성하여 팝업창에 업로드 합니다.

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

Sub CA 인증서 업로드 및 증명과정

 

 

6-2. IoT 디바이스용 인증서 생성

Azure IoT Central에 Device Enrollment gourp 생성 및 인증서 등록작업이 완료되었으면 이제 IoT 디바이스 인증서를 생성하면 IoT 보안통신을 위한 인증서 작업은 완료됩니다. 해당 IoT 디바이스 인증서는  Sub CA 디렉토리 에 생성합니다.

 Common Name 의 경우 IoT Device가 보안접속시 사용하는 ID으로 해당 이름은 Azure IoT Central에서의 식별 ID 입니다. 사용자 룰에 의해 임의로 설정이 가능합니다.

 

openssl genpkey -out device.key -algorithm RSA -pkeyopt rsa_keygen_bits:2048
openssl req -new -key device.key -out device.csr

-----
Country Name (2 letter code) [XX]:.
State or Province Name (full name) []:.
Locality Name (eg, city) [Default City]:.
Organization Name (eg, company) [Default Company Ltd]:.
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server hostname) []:`<your device ID>`
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

 

 

다음 명령어를 통해 CSR 확인 및 인증서 생성을 완료합니다.

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

 

 

6-3. Firmware에 디바이스용 인증서 파일 적용

  • RP2040-HAT-AZURE-C/examples/main.c
  • RP2040-HAT-AZURE-C/examples/sample_certs.c

main.c 의 application define 에서  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 의 아래 항목에 생성한 Device 인증서 및 Key 값을 입력합니다. 또한 인증서 생성시 입력한  Common Name 의 디바이스 ID 항목과 Azure IoT Central 의  ID scope 항목도 입력합니다.

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

const char pico_az_COMMON_NAME[] = "[custom-hsm-device]";

const char pico_az_CERTIFICATE[] = 
"-----BEGIN CERTIFICATE-----""\n"
"-----END CERTIFICATE-----";

const char pico_az_PRIVATE_KEY[] = 
"-----BEGIN PRIVATE KEY-----""\n"
"-----END PRIVATE KEY-----";

 

 

Azure IoT Central의 ID scope 항목은 Administration > Device connection 메뉴를 통해 확인할 수 있습니다.

 

6-4. Build and Run

Firmware 수정 후 Visual Code를 통해 해당 프로젝트를 Build 합니다. 생성된 main.uf2 파일을 W5100S_EVB_PICO 에 업로드하면 보드가 재부팅되면서 Azure IoT Central 에 보안접속 및 데이터 전송을 시작합니다.

[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​

 


 

 

7. Azure IoT Central 대시보드 구성 가이드

Azure IoT Central 로 전송되는 IoT 디바이스의 Telemetry 데이터는 Dashboard 에 의해서 다양하게 표현될 수 있습니다. 사용자는 Dashboard 에서 제공하는 다양한 Widget 을 통해 이미지를 업로드하거나, 마지막 데이터를 표시하고 또는 라인, 히트맵, 차트 형태등 다양하게 Dashboard 를 구성할 수 있습니다.

Azure IoT Central 대시보드 구성

 

 

관련글 더보기

댓글 영역