11/10/2021

AWS FreeRTOS Provisiong 자료수집 및 이해

1. AWS Provisioning 관련자료 

AWS Provisiong 관련자료 수집중이며, 우선 전체 구조와 동작방식 및 관련내용 메뉴얼을 우선 숙지 후 관련내용 정리 

우선 이를 기본적으로 이해하기 위해서는 TLS를 반드시 알아야하며, ESP32에서 AWS FreeRTOS를 사용하지 않고,
FreeRTOS에서 AWS-SDK를 Porting하여 기본 테스트를 진행하였지만, 현재 사용하고 있는 곳에서는 SRAM이 부족하여 이를 사용하기가 힘들 것 같다. 
다만, 일반적인 ESP32에서는 충분히 사용가능하다. 

AWS의 Embedded SDK Components 사용법 
최근에 들어가보니, 소스가 많이 변경되어 있으며, Manual도 새로 업데이트가 되어있다.
진작에 올려놓을 것이지, 젠장 
component도 이전과 완전다르며, 가능하다면, 최신버전으로 사용하시길 


  • AWS Provisiong 용어정리 
AWS Provisioning 의 크게 X.509 CSR(Certificate Signing Request) 구분되어진다. 
CSR도 X.509의 일종이지만, X.509를 요청하여 받는 것이며, 포맷은 X.509와 거의 유사하다.
  1. Fleet Provisiong without certificates: CSR 기반으로 인증서가 없이 인증하는 방법으로 나오며 다시 2종류 분류 
  2. Provisiong with certificates: X.509를 Device에 내장하여 진행하는 것으로 다시 3종류로 분류구분  


  • Provisioning with certificates 
Device들은 Certificate와 Private Key를 가지고 있는 구조로 또 다시 각 3개의 방식으로 구분되어짐 
참고로 상위 이름은 내가 임의로 정하며 AWS에서는 별다른 용어를 사용안함 
 
  1. JITP(Just in Time Provisioning): AWS IoT Core 만 이용 
  2. JITR(Just in Time Registration):  AWS IoT Core 와 AWS Lamda 이용 
  3. MAR(Multi-Account Registration): AWS IoT Core 의 Account가 여러개 사용 

결정적으로 보면, AWS IoT Core 와 AWS Lamda를 사용 때문으로 판단
그리고 Account를 한개 혹은 멀티로 가는지로 구분  

1.1 Fleet Provisioning by Claim 

Device는 Claim cerficates 와 private key와 함께 제조되어 생산되어진다.
그리고, 이 기반으로  AWS IoT core에 접속하여 CSR로 다시 unique device certicate로 다운을 받아 인증을 받고 이를 등록 후 TLS통신시작되어진다.  

Port 8883

  • Claim-based의 문서를 보면 크게 두개로 분리
  1. Device에게 전달되기전 (CreateProvisiongTemplate를 만들고 이를 IoT Thing등록)
  2. Device에서 전달된 후, 즉 Device에서 진행할일 아래에 설명 (디바이스는 이곳만 확인)

  • Device에게 Claim Certificate 전달되기 전의 과정 및 설정  
AWS에서 설정해야 할것들이라고 보면 될것 같다. 
  1. create-provisioning-template:  template name 과 parameter 정의
  2. create-keys-and-certificate: claim certificate 와 key  active 모드 변경 
  3. create-policy: fleet provisioning 정책결정 CreateKeysandCerficate or CreateCertificateFromCsr 

  • AWS IoT 의 create-provisioning-template 설정확인
AWS IoT -> Connect -> Fleet provisioning templates 확인 
  1. Json에서 "PolicyName": "<provisioned-thing-policy>" :  아래의 이름으로 연결됨 
  • AWS IoT 의 create-policy JSON 설정확인
AWS IoT -> 보안 -> 정책 -> provisioned-thing-policy 확인 
  1. Json에서 둘중 하나로 결정 $aws/certificates/create-from-csr or $aws/certificates/create 설정


  • AWS IOT Endpoint
account-specific-prefix.iot.aws-region.amazonaws.com

  • Device에게 전달 된 후 진행될 일 (아래그림)
상위 그림을 간단히 요약하면, 처음 Claiim Certifcate 와 Key 기반으로 TLS로 MQTT로 AWS IoT를 접속하여 아래와 같이 두번의 절차를 진행 
  1. CreateKeysAndCertificate or CreateCertificateFromCsr 진행 
  2. RegisterThing진행 


https://d1.awsstatic.com/whitepapers/device-manufacturing-provisioning.pdf


  • MQTT의 TOPIC: Unique Device Certicate 와 Key Download
  1. $aws/certificates/create/json
  2. $aws/certificates/create/json/accepted
  3. $aws/certificates/create/json/rejected

MQTT CreateKeysAndCertificate
상위 TOPIC과 동일하며 Embedded C or C++ 예제는 현재없음(직접작성)

MQTT CreateCertificateFromCsr
상위 TOPIC중 create를 create-cert-csr로 변경, 예제참조가능하나 테스트 못함  

HTTP CreateKeysAndCertificate 
Fleet Provisiong는 미지원으로 파악되지만, 일반 Provisiong은 가능 (Owershiptoken이 필요)

  • MQTT 의 TOPIC : AWS Lamda 연결및  Provisiong Template
  1. $aws/provisioning-templates/{template-name}/provision/json
  2. $aws/provisioning-templates/{template-name}/provision/json/accepted
  3. $aws/provisioning-templates/{template-name}/provision/json/rejected

MQTT RegisterThing
상위 TOPIC과 동일하며, 이때 Device의 정보를 Parameter로 전달하고 Configuration 값을 받음

HTTP RegisterThing 
일반 Provisiong 에서 사용가능하나, Fleet Provisiong은 불가능 파악 (Ownership Token이 없음)

AWS MQTT API 

관련소스 Header 

PKC11의 전체구조
현재 PKC11의 필요성이 Token인데, 이 부분이 Ownership Token하고 관련이 있는지?? 


1.2 Fleet Provisioning by Trusted User

AWS IoT에 처음 접속할 때 Trusted User 경우에 사용한다고하며, 주로 End User/설치기술자가 될 때 사용한다고 한다.   
Claim 과 차이는 처음부터 CSR을 가지고 있지 않으며, Trusted User가 CreateProvisiongTemplate 함수를 이용하여 CSR와 CSR Key를 받으면, 상위 구조와 얼추 비슷하게 흘러간다. 

Claim 과 차이라고하면, CSR를 누가 갖고 있는냐고, 이기능은 AWS Lamda를 미사용 


https://d1.awsstatic.com/whitepapers/device-manufacturing-provisioning.pdf


AWS API (CreateProvisiongTemplate) HTTP로 구현 

CreateProvisiongTemplate 는 AWS CLI에서 어떻게 하는것으로 생각되어짐 


1.3 Fleet Provisiong PC기반 테스트 

  • Fleet Provisiong PC기반테스트 방법
  1. Create a provisiong temlate  (aws iot 로 진행)
  2. Create claim cirtificate and key (Claim 인증서/Key 생성)
  3. 상위 결과의 JSON에서  .certificateArn 값을 얻어옴 
  4. AWS IoT의 Policy를 claim certificate를 위해서 생성 및 이를 연결  
  5. Device에서 python code 로 fleet provision 진행 (Serial 과 Device 정보)
  6. fleet provisiong이 완료 후 이를 검증 
  7. mosquitto로 fleet provisiong 후 얻은 certificate와 key로 진행  (root.ca)


2. FreeRTOS AWS SDK Provisiong 관련자료 

  • CreateCertificateFromCsr: TOPIC도 가능하며, 예제참조 
Fleet Provisiong의 기본개념은 CSR을 이용하여 AWS IoT에게 X.509를 받아 저장 후 이를 기반으로 등록한 후 TLS통신을 하는 개념이다.  
이때 사용되어지는 것이 MQTT이며, 이를 이용하여 요청 및 인증서를 받는다. 


AWS MQTT Demo의 구성
AWS MQTT에서 내부적으로 Backoff 기능을 사용되는 것으로 파악(Back Off가 무엇인지?)
한글문서는 오타가 너무 많음(재미있는 것은 현재 ESP32는 MQTT QoS 1기반 TLS 이지만 아래는 QoS2 사용)  

AWS IoT Device SDK C 관련문서: Fleet Provisioning
현재 이상한 것은 이 관련된 함수는 AWS FreeRTOS에는 없는 것으로 파악 (API가 서로 다른 것으로 파악되며 최신꺼에도 아래 함수가 없어짐?? 선택?)
CSR기반으로 하는 인증 찾음 (관련 한글설명도 나옴)

CSR기반으로 하는 인증의 전체구조 
현재 Provisiong Library 없어진것으로 파악, 주의해야 함 (참조만 해야할 것 같음)


AWS MQTT Fleet Provisioning
MQTT Provisiong을 하는데, CSR을 사용하는 것으로 추측 

AWS FreeRTOS  관련문서 
AWS FreeRTOS와 상위 IoT Device의 소스에서 사용되는 함수 다르며, 이것도 글을 읽어보면 CSR기반??

AWS FreeRTOS Build 및 개발환경 (ESP32)
ESP-IDF가 전부 4.2기준으로 작성되며 이 부분 확인 

Fleet Provisioning 관련 정보
글을 읽다보면, CSR을 이용하여 동작이 되는 것 같으며, 이유는 ROM size를 줄이기 위해서 X.509를 사용하지 않는 것으로 보이는데, 전의 KCMVP 와 좀 다른 구조?
어째든 ECDSA 기반으로 구성되는 것으로 보임 

AWS 개발자 Guide로 CA 및 인증서 등록방법 추후 알아야 할 거 같음 

AWS CLI
GCP와 구조가 비슷한 것으로 보이며, 일단 이거 사용법은 나중에 알아야 할 거 같음



2.2 PKCS#11 의 이해

PKCS는 공개키 암호화 표준으로 AWS IoT에서 PKCS#11을 사용하며, 이곳에 Ceritificate를 보관하여 동작하는 구조이다.

PKCS(Public Key Cryptography Standards)

PKCS#11 (Cryptographic Token Interface Base Specification)
문서를 읽어보면, Smart Card, TPM(Trusted Platform Module), HSM(Hardware Security Module)에 사용되어진다고 하며,
Secure Key를 Storage에 저장하는 역할이라고 하며,
표준은 두 군데에서 진행하며 주로 보면 OASIS가 주체적으로 하는 것으로 보임



AWS corePKCS11 
AWS에서는 처음 PKCS11 Sessiong을 생성한 후 Cerficate와 Key를 PKCS11를 이용하여 RSA 혹은 ECDSA 방식 corePKCS11를 이용하여 Provising을 Flash Storage 저장한다.
이 PKCS11으로 저장된 Cerficate와 Key의 기반으로 Session을 만들어 TLS를 사용하여 접속진행
현재 ESP32 OpenSSL이 아닌 mbedTLS를 사용하는 구조임

xInitializePkcs11Session
SlotList를 가져오고, PKCS11 Login

Certificate 와 Key를 PKCS11으로 Provisiong 진행
provisionCertificate

provisionPrivateKey

Mbedtls_Pkcs11_Connect
Mbedtls_Pkcs11_Recv
Mbedtls_Pkcs11_Send


소스보면, Fleet Provisiong을 해보면 내부에 DER형식으로 Template으로 Certificate와 Key를 별도생성하는데,
이 API를 이용하며 RSA/ECDSA 방식으로 각 Certificate와 Private Key를 저장한 후 PKCS11 Session 기반의 TLS을 사용하는데,
일반적인 TLS와는 다른 방식으로 보인다.
현재로 보면 AWS에서 PKCS11는 필요할 것으로 보임

PKCS11
관련 한글자료


2.3 FreeRTOS의 AWS Provisiong 관련소스

현재 Embedded 용으로 파악되는 것은 아래와 같이 Provisiong을 위해서 두개의 OpenSource 이며
관련내용은 아래의 링크를 참조해서 파악하자.

  • AMAZON FREERTOS (AWS FreeRTOS)
Amazon에서 FreeRTOS기반으로 SDK가 포함되어져 만들었으며, Provisiong을 어떻게하는지 파악을 못함

  • AWS IoT Device SDK 관련소스 (Version에따라 구조가 다름)
AWS 에서 IoT를 위한 SDK로 MQTT는 QoS2 기반으로 TLS통신하는 것으로 파악되며, 현재 ESP32의 MQTT는 지원불가능??(ESP QoS1까지만 지원)
WSS로 사용할 경우에도 RootCA 설정하는 곳이 없음 

AWS IoT Device SDK 문서 

  • AWS Provisioning Python로 PC 테스트 용 (AWS CLI 필요)
PC에서 가장 손쉽게 테스트 하는 방법으로 상위 PC 테스트 Manual에서 aws cli 와 함께 진행