Ex3. ① OTA FW IMAGE 생성
( 태그 : AWS_IoT_FreeRTOS, AWS_IoT )
Upgrade 하는 FW Image에 대한 인증과 무결성 검증은 다음과 같은 과정으로 진행 됩니다.
코드 암호화를 위한 Private Key와 무결성 검증을 위한 ECDSA Signature 인증서를 AWS에 등록 시켜 사용 합니다.
1. Create code signing Certificate
1-1. Signing Certficate 생성
Certificate 생성에 OpenSSL을 사용합니다. 설치가 되어 있지 않다면 실습 0-6을 참고하여 설치 합니다.
실습용으로 다운로드한 Package의 x-cube-aws-sensordemo/scripts/ota-scripts 폴더를 참조 하십시오. Batch 파일을 이용해 cert_config.txt 파일만 변경하여 인증서 파일을 간단히 생성하여 사용할 수 있습니다.
다음의 내용을 포함하는 cert_config.txt 파일을 생성 합니다.
[ req ]
prompt = no
distinguished_name = my_dn
[ ota_dn ]
commonName = test_signer@amazon.com
[ ota_exts ]
keyUsage = digitalSignature
extendedKeyUsage = codeSigning
- ECDSA 코드로 서명된 private key를 생성 합니다 : ecdsasigner.key
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -pkeyopt ec_param_enc:named_curve -outform PEM -out ecdsasigner.key
- ECDSA 코드로 서명된 인증서를 생성 합니다 : ecdsasigner.crt
openssl req -new -x509 -config cert_config.txt -extensions ota_exts -nodes -days 365 -key ecdsasigner.key -out ecdsasigner.crt
1-2. Signing Certficate 등록 (AWS CLI 사용시 진행)
- 인증서를 ACM에 등록하여 사용합니다. 등록하는 방법은 AWS CLI를 사용할 수 도 있고 OTA Job을 생성하면서 콘솔을 통해 등록할 수 도 있습니다.
- 본 실습에서는 OTA Job을 생성하면서 콘솔을 통해 Upload 합니다. 다음의 AWS CLI 명령 실행은 진행하지 않습니다.
본 실습에서는 OTA Job을 생성하면서 콘솔을 통해 Upload 합니다. 다음의 AWS CLI 명령 실행은 진행하지 않습니다.
AWS CLI를 사용하는 방법은 다음과 같습니다. AWS CLI 작업 시 참고 하시면 됩니다.
코드 서명 인증서, 프라이빗 키 및 인증서 체인을 AWS Certificate Manager로 import 시킵니다.
aws acm import-certificate --certificate fileb://ecdsasigner.crt --private-key fileb://ecdsasigner.key
- 실행 결과로 등록된 Certificate의 ARN이 return 됩니다. 이 ARN을 OTA Job을 생성할 때 사용합니다.
{ "CertificateArn": "arn:aws:acm:ap-northeast-2:189427507247:certificate/972ef760-0ec9-488f-bfad-8048f67e1268" }
2. ‘OTA Update’ Project
2-1. Project 기능 변경
- ‘B-L4S5I-IOT01_aws_demos’ project는 여러가지 기능으로 Build 할 수 있습니다.
- Application을 OTA Update 전용으로 설정하여 사용합니다. OTA Update는 FreeRTOS의 OTA agent demo를 사용 합니다.
- Application/AWS/config_files/aws_demo_config.h 파일에서 OTA Update define 하여 Build 합니다.
- CONFIG_MQTT_DEMO_ENABLED를 undefine 하고
- CONFIG_UPDATE_DEMO_ENABLED define 합니다.
- Custom Demo Disable
- Sensor application 작성 시 enable 시키 custom demo 기능을 disable 시킵니다.
- CONFIG_ST_CUSTOM_DEMO_ENABLED를 undefine 하고 FreeRTOS 기본 demo version으로 동작 시킵니다.
- Applications/Cloud/aws_demos/Inc/main.h
/* Exported macro ------------------------------------------------------------*/
/* USER CODE BEGIN EM */
//#define CONFIG_ST_CUSTOM_DEMO_ENABLED
/* USER CODE END EM */
2-2. Code Signing Certificate 추가
- OTA Image를 검증 할 코드 서명 인증서를 Project에 추가합니다.
- B-L4S5I-IOT01A/Applications/Cloud/aws_demos/Src/ports/aws_ota_pal.c
- ecdsasigner.crt 파일 contents를 pcClientCertificatePem[] 에 입력합니다.
static const char pcClientCertificatePem[] =
"-----BEGIN CERTIFICATE-----\n"
"MIICNjCCAbygAwIBAgIUEFCiZSz0U0NfD/kvxi8plpqaIzgwCgYIKoZIzj0EAwIw\n"
"UjELMAkGA1UEBhMCWFgxFTATBgNVBAcMDERlZmF1bHQgQ2l0eTEcMBoGA1UECgwT\n"
"RGVmYXVsdCBDb21wYW55IEx0ZDEOMAwGA1UEAwwFU1RNMzIwHhcNMTkwODAxMTM0\n"
"MzAzWhcNMjIwNDI3MTM0MzAzWjBSMQswCQYDVQQGEwJYWDEVMBMGA1UEBwwMRGVm\n"
"YXVsdCBDaXR5MRwwGgYDVQQKDBNEZWZhdWx0IENvbXBhbnkgTHRkMQ4wDAYDVQQD\n"
"DAVTVE0zMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ2bLnKMrhIv8dYwT5C37580\n"
"xdvsqmVVZKTlRZUatELS2Njq/X+ekalP4W87BDRoQAxHIeHbJwpjTZO0yHz0FasT\n"
"nOV4gQigVB4PG8DZU9SfoJ1m4Ri8Y+rdtbnGGVAd2KNTMFEwHQYDVR0OBBYEFNpZ\n"
"KYz6S/zzKlyu3KWN07uInExyMB8GA1UdIwQYMBaAFNpZKYz6S/zzKlyu3KWN07uI\n"
"nExyMA8GA1UdEwEB/wQFMAMBAf8wCgYIKoZIzj0EAwIDaAAwZQIxAMCm5HMx1REz\n"
"oxYV0/jDB2VGrBaQ5dSj4rHeA+wpGgRZI8TSqDB+NWXimVXrJG5gQgIwZ9Ek8+YV\n"
"kpFNZ102HE1pOqbI4UcVAiQejK5n2TSuxGbxrl29FYjrSGKrWa2Jt2Ws\n"
"-----END CERTIFICATE-----\n";
3. Project Build & Programming
- Programming전 Application Version을 확인합니다.
- STM32CubeExpansion_Cloud_AWS_V2.0.0/Middlewares/Third_Party/amazon-freertos/demos/include/aws_application_version.h
- B-L4S5I-IOT01_aws_demos 프로젝트를 재 build한 후 생성된 binary image를 STM32 MCU 보드에 programming 합니다.
- B-L4S5I-IOT01_aws_demos.bin 파일이 저장되는 위치는 ‘STM32CubeExpansion_Cloud_AWS_V2.0.0/Projects/B-L4S5I-IOT01A/Applications/Cloud/aws_demos/STM32CubeIDE/PostBuild/’ 입니다.
- Terminal 로그에서 OTA demo version을 확인 합니다.
- OTA demo version 0.9.2
6 3679 [iot_thread] [INFO ][DEMO][3679] ---------STARTING DEMO---------
7 3686 [iot_thread] [INFO ][INIT][3686] SDK successfully initialized.
..8 7400 [iot_thread] [INFO ][DEMO][7400] Successfully initialized the demo. Network type for the demo: 1
9 7409 [iot_thread] [INFO ][MQTT][7409] MQTT library successfully initialized.
10 7416 [iot_thread] OTA demo version 0.9.2
11 7420 [iot_thread] Creating MQTT Client...
..12 11979 [iot_thread] Connecting to broker...
13 11983 [iot_thread] [INFO ][MQTT][11983] Establishing new MQTT connection.
4. FW OTA Update Image 생성
Image Build Flow
- Image 생성 과정은 다음과 같은 Flow로 진행 됩니다.
- Build 단게에서는 소스 코드를 compile과 link 과정을 통해 binary 파일과 elf 파일을 생성 합니다.
- PostBuild 단계에서 Bootloader와 Build된 Application binary를 combine 하고 암호화를 진행 합니다. 이 과정에서 update를 위해 Application만 포함하고 있는 sfb 파일을 생성 합니다.
4-1 OTA demo version 변경
- Demo Application Version을 변경 합니다.
- STM32CubeExpansion_Cloud_AWS_V2.0.0/Middlewares/Third_Party/amazon-freertos/demos/include/aws_application_version.h
#define APP_VERSION_MAJOR 1
#define APP_VERSION_MINOR 2
#define APP_VERSION_BUILD 1
4-2. Project Build
- OTA로 Update할 Image 파일은 다음과 같습니다.
- STM32CubeExpansion_Cloud_AWS_V2/Project/B-L4S5l-lOTA01A/Applications/Cloud/aws_demos/STM32CubeIDE/PostBuild/B-L4S5l-lOT01_aws_demos.sfb
5. FW OTA Image file upload
- Amazon S3 서비스 콘솔에서 OTA용 S3 bucket을 생성합니다.
그리고, 우측 상단에 TeamRole/MasterKey @ 12자리 숫자 형식으로 된 버튼을 클릭하여, 내 계정의 12자리 고유 번호를 복사합니다.
Bucket 이름을 afr-ota-[내 계정의 12자리 고유 숫자] 형식으로 입력하고 Region은 Seoul을 선택 한 후 Next 버튼을 클릭합니다. 예를 들면 afr-ota-355516781203 와 같이 버킷의 이름을 사용하실 수 있습니다.
- Bucket Versioning을 enable하고 Create bucket을 클릭하여 버킷을 생성합니다.
- 생성된 bucket에 FW Image 파일(B-L4S5l-lOT01_aws_demos.sfb)을 Upload 합니다.
Credits
Korean version
Jongwoo Lee (rainny@)
Sejun Kim (sejun@)
Albert Lee (sehyul@)
Original Contents Author
Vanitha Ramaswami (rvanitha@)
© 2020 Amazon Web Services, Inc. or its Affiliates. All rights reserved.
메이커스페이스 G·캠프에서 만든 콘텐츠가 아니며, 서울하드웨어해커톤에서 강의가 진행될 예정입니다.
'05_Toolkit > AWS_IoT' 카테고리의 다른 글
[번역, Korean Caption ] FreeRTOS on STM32 ( 1 of 4) (0) | 2020.12.16 |
---|---|
Ex3. ② OTA FW UPDATE (0) | 2020.11.26 |
Ex3. OTA FIRMWARE UPDATE (0) | 2020.11.26 |
Ex2. ② SENSOR 추가 및 제어 (0) | 2020.11.26 |
Ex2. ① SENSOR DASHBOARD (0) | 2020.11.26 |