

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# OTA 업데이트 사전 조건
<a name="ota-prereqs"></a>

무선 업데이트(OTA)를 사용하려면 다음을 수행합니다.
+ [HTTP를 사용한 OTA 업데이트 사전 조건](ota-http-freertos.md) 또는 [MQTT를 사용한 OTA 업데이트 사전 조건](ota-mqtt-freertos.md)를 확인합니다.
+ [업데이트를 저장할 Amazon S3 버킷 생성](dg-ota-bucket.md).
+ [OTA 업데이트 서비스 역할 생성](create-service-role.md).
+ [OTA 사용자 정책 생성](create-ota-user-policy.md).
+ [코드 서명 인증서 생성](ota-code-sign-cert.md).
+ 에 코드 서명을 사용하는 경우 AWS IoT[에 대한 코드 서명에 대한 액세스 권한 부여 AWS IoT](code-sign-policy.md).
+ [OTA 라이브러리와 함께 FreeRTOS 다운로드](ota-download-freertos.md).

# 업데이트를 저장할 Amazon S3 버킷 생성
<a name="dg-ota-bucket"></a>

OTA 업데이트 파일은 Amazon S3 버킷에 저장됩니다.

Code Signing for AWS IoT를 사용하는 경우 코드 서명 작업을 생성하는 데 사용하는 명령은 소스 버킷(서명되지 않은 펌웨어 이미지가 있는 위치)과 대상 버킷(서명된 펌웨어 이미지가 작성된 위치)을 사용합니다. 소스와 대상 모두에 동일한 버킷을 지정할 수 있습니다. 원래 파일을 덮어쓰지 않도록 파일 이름이 GUID로 변경됩니다.<a name="create-bucket"></a>

**Amazon S3 버킷을 생성하려면**

1. [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 Amazon S3 콘솔에 로그인합니다.

1. **버킷 생성**을 선택합니다.

1. **버킷 이름**을 입력합니다.

1. **퍼블릭 액세스 차단을 위한 버킷 설정**에서 **모든 퍼블릭 액세스 차단**을 선택한 상태로 유지하여 기본 권한을 수락합니다.

1. **버킷 버전 관리**에서 **활성화**를 선택하여 모든 버전을 동일 버킷 내에 유지합니다.

1. **버킷 생성**을 선택합니다.

Amazon S3에 대한 자세한 내용은 [Amazon Simple Storage Service 사용 설명서](https://docs.aws.amazon.com/AmazonS3/latest/userguide/)를 참조하세요.

# OTA 업데이트 서비스 역할 생성
<a name="create-service-role"></a>

OTA 업데이트 서비스에서는 이 역할로 사용자 대신 OTA 업데이트 작업을 생성하고 관리한다고 가정합니다.<a name="create-service-role-steps"></a>

**OTA 서비스 역할을 생성하려면**

1. [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 로그인합니다.

1. 탐색 창에서 **역할**을 선택합니다.

1. **역할 생성**을 선택합니다.

1. [**신뢰할 수 있는 유형의 엔터티 선택(Select type of trusted entity)**] 아래에서 **AWS 서비스**를 선택합니다.

1.  AWS 서비스 목록에서 **IoT**를 선택합니다.

1. **사용 사례 선택(Select your use case)** 아래에서 **IoT**를 선택합니다.

1. **다음: 권한**을 선택합니다.

1. **다음: 태그**를 선택합니다.

1. **다음: 검토**를 선택합니다.

1. 역할 이름과 설명을 입력한 후 **역할 생성**을 선택합니다.

IAM 역할에 대한 자세한 내용은 [IAM 역할](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)을 참조하세요.

**중요**  
혼동된 대리자 보안 문제를 해결하려면 [AWS IoT Core](https://docs.aws.amazon.com/iot/latest/developerguide/cross-service-confused-deputy-prevention.html) 설명서의 지침을 따라야 합니다.<a name="add-ota-permissions"></a>

**OTA 서비스 역할에 OTA 업데이트 권한을 추가하려면**

1. IAM 콘솔 페이지의 검색 상자에 역할 이름을 입력한 후 목록에서 해당 역할을 선택합니다.

1. **정책 연결**을 선택합니다.

1. **검색** 상자에 "AmazonFreeRTOSOTAUpdate"를 입력하고 필터링된 정책 목록에서 **AmazonFreeRTOSOTAUpdate**를 선택한 후 **정책 연결**을 선택하여 정책을 서비스 역할에 연결합니다.<a name="add-iam-permissions"></a>

**OTA 서비스 역할에 필요한 IAM 권한을 추가하려면**

1. IAM 콘솔 페이지의 검색 상자에 역할 이름을 입력한 후 목록에서 해당 역할을 선택합니다.

1. **인라인 정책 추가**를 선택합니다.

1. **JSON** 탭을 선택합니다.

1. 다음 정책 문서를 복사해 텍스트 상자에 붙여 넣습니다.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "iam:GetRole",
                   "iam:PassRole"
               ],
               "Resource": "arn:aws:iam::111122223333:role/your_role_name"
           }
       ]
   }
   ```

------

   *your\$1account\$1id*를 AWS 계정 ID로 바꾸고 *your\$1role\$1name*을 OTA 서비스 역할의 이름으로 바꿔야 합니다.

1. **정책 검토**를 선택합니다.

1. 정책 이름을 입력한 후 **정책 생성**을 선택합니다.

**참고**  
Amazon S3 버킷 이름이 ‘afr-ota’로 시작하는 경우에는 다음 절차가 필요하지 않습니다. 이 경우 AWS 관리형 정책에는 필요한 권한이 `AmazonFreeRTOSOTAUpdate` 이미 포함되어 있습니다.<a name="add-s3-permissions"></a>

****OTA 서비스 역할에 필요한 Amazon S3 권한을 추가하려면****

1. IAM 콘솔 페이지의 검색 상자에 역할 이름을 입력한 후 목록에서 해당 역할을 선택합니다.

1. **인라인 정책 추가**를 선택합니다.

1. **JSON** 탭을 선택합니다.

1. 다음 정책 문서를 복사하여 상자에 붙여넣습니다.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "s3:GetObjectVersion",
                   "s3:GetObject",
                   "s3:PutObject"
               ],
               "Resource": [
                   "arn:aws:s3:::example-bucket/*"
               ]
           }
       ]
   }
   ```

------

   이 정책은 Amazon S3 객체를 읽을 수 있는 OTA 서비스 역할 권한을 부여합니다. *example-bucket*을 해당 버킷 이름으로 바꿉니다.

1. **정책 검토**를 선택합니다.

1. 정책 이름을 입력한 후 **정책 생성**을 선택합니다.

# OTA 사용자 정책 생성
<a name="create-ota-user-policy"></a>

 사용자에게 OTA 업데이트 수행 권한을 부여해야 합니다. 사용자에게 다음에 대한 권한이 있어야 합니다.
+ 펌웨어 업데이트를 저장할 S3 액세스
+ 에 저장된 인증서에 액세스합니다 AWS Certificate Manager.
+  AWS IoT MQTT 기반 파일 전송 기능에 액세스합니다.
+ FreeRTOS OTA 업데이트에 액세스
+  AWS IoT 작업에 액세스합니다.
+ IAM에 액세스
+ 에 대한 액세스 코드 서명입니다 AWS IoT. [에 대한 코드 서명에 대한 액세스 권한 부여 AWS IoT](code-sign-policy.md)을(를) 참조하세요.
+ FreeRTOS 하드웨어 플랫폼 나열
+  AWS IoT 리소스에 태그를 지정하고 태그를 해제합니다.

사용자에게 필요한 권한을 부여하려면 [IAM 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html)을 참조하세요. 또한 [사용자 및 클라우드 서비스에 AWS IoT 작업 사용 권한 부여를 참조하세요](https://docs.aws.amazon.com/iot/latest/developerguide/iam-policy-users-jobs.html).

액세스 권한을 제공하려면 사용자, 그룹 또는 역할에 권한을 추가하세요.
+ 의 사용자 및 그룹 AWS IAM Identity Center:

  권한 세트를 생성합니다. *AWS IAM Identity Center 사용자 안내서*에서 [권한 세트 생성](https://docs.aws.amazon.com//singlesignon/latest/userguide/howtocreatepermissionset.html)의 지침을 따릅니다.
+ ID 제공업체를 통해 IAM에서 관리되는 사용자:

  ID 페더레이션을 위한 역할을 생성합니다. *IAM 사용자 설명서*의 [Create a role for a third-party identity provider (federation)](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-idp.html)의 지침을 따릅니다.
+ IAM 사용자:
  + 사용자가 맡을 수 있는 역할을 생성합니다. *IAM 사용자 설명서*에서 [Create a role for an IAM user](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-user.html)의 지침을 따릅니다.
  + (권장되지 않음) 정책을 사용자에게 직접 연결하거나 사용자를 사용자 그룹에 추가합니다. *IAM 사용 설명서*에서 [사용자(콘솔)에 권한 추가](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_users_change-permissions.html#users_change_permissions-add-console)의 지침을 따릅니다.

# 코드 서명 인증서 생성
<a name="ota-code-sign-cert"></a>

펌웨어 이미지에 디지털 방식으로 서명하려면 코드 서명 인증서와 프라이빗 키가 필요합니다. 테스트 목적으로 자체 서명된 인증서와 프라이빗 키를 생성할 수 있습니다. 프로덕션 환경에서는 잘 알려진 인증 기관(CA)을 통해 인증서를 구입하십시오.

플랫폼에 따라 필요한 코드 서명 인증서 유형이 다릅니다. 다음 단원에서는 서로 다른 FreeRTOS 적격 플랫폼에 대한 코드 서명 인증서를 생성하는 방법을 설명합니다.

**Topics**
+ [Texas Instruments CC3220SF-LAUNCHXL을 위한 코드 서명 인증서 생성](ota-code-sign-cert-ti.md)
+ [Espressif ESP32에 대한 코드 서명 인증서 생성](ota-code-sign-cert-esp.md)
+ [Nordic nrf52840-dk에 대한 코드 서명 인증서 생성](ota-code-sign-cert-nordic.md)
+ [FreeRTOS Windows 시뮬레이터용 코드 서명 인증서 생성](ota-code-sign-cert-win.md)
+ [사용자 지정 하드웨어에 대한 코드 서명 인증서 생성](ota-code-sign-cert-other.md)

# Texas Instruments CC3220SF-LAUNCHXL을 위한 코드 서명 인증서 생성
<a name="ota-code-sign-cert-ti"></a>

**중요**  <a name="deprecation-message"></a>
이 라이브러리는 더 이상 사용되지 않는 Amazon-FreeRTOS 리포지토리에서 호스팅됩니다. 새 프로젝트를 생성할 때는 [여기서 시작](freertos-getting-started-modular.md)하는 것이 좋습니다. 현재 사용되지 않는 Amazon-FreeRTOS 리포지토리를 기반으로 하는 기존 FreeRTOS 프로젝트가 이미 있는 경우에는 [Amazon-FreeRTOS Github 리포지토리 마이그레이션 가이드](github-repo-migration.md) 섹션을 참조하세요.

SimpleLink Wi-Fi CC3220SF Wireless Microcontroller Launchpad Development Kit는 펌웨어 코드 서명을 위한 두 가지 인증서 체인을 지원합니다.
+ 프로덕션(인증서 카탈로그)

  프로덕션 인증서 체인을 사용하려면 상용 코드 서명 인증서를 구매하고 [TI Uniflash 도구](http://www.ti.com/tool/UNIFLASH)를 사용하여 보드를 프로덕션 모드로 설정해야 합니다.
+ 테스트 및 개발(인증서 실습) 

  플레이그라운드 인증서 체인을 사용하면 자체 서명된 코드 서명 인증서를 사용하여 OTA 업데이트를 시험해 볼 수 있습니다.

 AWS Command Line Interface 를 사용하여 코드 서명 인증서, 프라이빗 키 및 인증서 체인을 로 가져옵니다 AWS Certificate Manager. 자세한 내용은 *AWS Command Line Interface 사용 설명서*에서 [AWS CLI설치](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)를 참조하세요.

최신 버전의 [SimpleLink CC3220 SDK](http://www.ti.com/tool/download/SIMPLELINK-CC3220-SDK)를 다운로드하여 설치합니다. 기본적으로 필요한 파일은 다음 위치에 있습니다.

`C:\ti\simplelink_cc32xx_sdk_version\tools\cc32xx_tools\certificate-playground`(Windows) 

`/Applications/Ti/simplelink_cc32xx_version/tools/cc32xx_tools/certificate-playground`(macOS)

SimpleLink CC3220 SDK의 인증서는 DER 형식입니다. 자체 서명된 코드 서명 인증서를 생성하려면 이를 PEM 형식으로 변환해야 합니다.

다음 단계에 따라 Texas Instruments 플레이그라운드 인증서 계층 구조에 연결되고 AWS Certificate Manager 및 Code Signing for AWS IoT criteria를 충족하는 코드 서명 인증서를 생성합니다.

**참고**  
코드 서명 인증서를 생성하려면 컴퓨터에 [OpenSSL](https://www.openssl.org/)을 설치합니다. OpenSSL을 설치한 후 명령 프롬프트나 터미널 환경에서 `openssl`이 OpenSSL 실행 파일에 할당되었는지 확인합니다.

**자체 서명된 코드 서명 인증서를 생성하려면**

1. 명령 프롬프트 창이나 터미널을 관리자 권한으로 엽니다.

1. 작업 디렉터리에서 다음 텍스트를 사용하여 `cert_config.txt` 파일을 생성합니다. *test\$1signer@amazon.com*을 사용자의 이메일 주소로 바꿉니다.

   ```
   [ req ]
   prompt             = no
   distinguished_name = my dn
   
   [ my dn ]
   commonName = test_signer@amazon.com
   
   [ my_exts ]
   keyUsage         = digitalSignature
   extendedKeyUsage = codeSigning
   ```

1. 프라이빗 키 및 인증서 서명 요청(CSR)을 생성합니다.

   ```
   openssl req -config cert_config.txt -extensions my_exts -nodes -days 365 -newkey rsa:2048 -keyout tisigner.key -out tisigner.csr
   ```

1. Texas Instruments 실습 루트 CA 프라이빗 키를 DER 형식에서 PEM 형식으로 변환합니다.

   TI 실습 루트 CA 프라이빗 키는 다음 위치에 있습니다.

   `C:\ti\simplelink_cc32xx_sdk_version\tools\cc32xx_tools\certificate-playground\dummy-root-ca-cert-key`(Windows) 

   `/Applications/Ti/simplelink_cc32xx_sdk_version/tools/cc32xx_tools/certificate-playground/dummy-root-ca-cert-key`(macOS)

   ```
   openssl rsa -inform DER -in dummy-root-ca-cert-key -out dummy-root-ca-cert-key.pem
   ```

1. Texas Instruments 실습 루트 CA 인증서를 DER 형식에서 PEM 형식으로 변환합니다.

   TI 실습 루트 인증서는 다음 위치에 있습니다.

   `C:\ti\simplelink_cc32xx_sdk_version\tools\cc32xx_tools\certificate-playground/dummy-root-ca-cert`(Windows) 

   `/Applications/Ti/simplelink_cc32xx_sdk_version/tools/cc32xx_tools/certificate-playground/dummy-root-ca-cert`(macOS)

   ```
   openssl x509 -inform DER -in dummy-root-ca-cert -out dummy-root-ca-cert.pem
   ```

1. Texas Instruments 루트 CA로 CSR에 서명합니다.

   ```
   openssl x509 -extfile cert_config.txt -extensions my_exts  -req -days 365 -in tisigner.csr -CA dummy-root-ca-cert.pem -CAkey dummy-root-ca-cert-key.pem -set_serial 01 -out tisigner.crt.pem -sha1
   ```

1. 코드 서명 인증서(`tisigner.crt.pem`)를 DER 형식으로 변환합니다.

   ```
   openssl x509 -in tisigner.crt.pem -out tisigner.crt.der -outform DER
   ```
**참고**  
나중에 TI 개발 보드에 `tisigner.crt.der` 인증서를 작성합니다.

1. 코드 서명 인증서, 프라이빗 키 및 인증서 체인을 AWS Certificate Manager다음으로 가져옵니다.

   ```
   aws acm import-certificate --certificate fileb://tisigner.crt.pem --private-key fileb://tisigner.key --certificate-chain fileb://dummy-root-ca-cert.pem
   ```

   이 명령은 인증서에 대한 ARN을 표시합니다. OTA 업데이트 작업을 생성할 때 이 ARN이 필요합니다.
**참고**  
이 단계는 용 코드 서명을 사용하여 펌웨어 이미지에 서명한다는 가정하 AWS IoT 에 작성되었습니다. 용 코드 서명을 사용하는 AWS IoT 것이 좋지만 펌웨어 이미지에 수동으로 서명할 수 있습니다.

# Espressif ESP32에 대한 코드 서명 인증서 생성
<a name="ota-code-sign-cert-esp"></a>

**중요**  <a name="deprecation-message"></a>
이 라이브러리는 더 이상 사용되지 않는 Amazon-FreeRTOS 리포지토리에서 호스팅됩니다. 새 프로젝트를 생성할 때는 [여기서 시작](freertos-getting-started-modular.md)하는 것이 좋습니다. 현재 사용되지 않는 Amazon-FreeRTOS 리포지토리를 기반으로 하는 기존 FreeRTOS 프로젝트가 이미 있는 경우에는 [Amazon-FreeRTOS Github 리포지토리 마이그레이션 가이드](github-repo-migration.md) 섹션을 참조하세요.

Espressif ESP32 보드는 ECDSA 코드 서명 인증서로 자체 서명된 SHA-256을 지원합니다.

**참고**  
코드 서명 인증서를 생성하려면 컴퓨터에 [OpenSSL](https://www.openssl.org/)을 설치합니다. OpenSSL을 설치한 후 명령 프롬프트나 터미널 환경에서 `openssl`이 OpenSSL 실행 파일에 할당되었는지 확인합니다.  
 AWS Command Line Interface 를 사용하여 코드 서명 인증서, 프라이빗 키 및 인증서 체인을 로 가져옵니다 AWS Certificate Manager. 설치에 대한 자세한 내용은 설치를 AWS CLI참조하세요. [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) 

1. 작업 디렉터리에서 다음 텍스트를 사용하여 `cert_config.txt` 파일을 생성합니다. *test\$1signer@amazon.com*을 사용자의 이메일 주소로 바꿉니다.

   ```
   [ req ]
   prompt             = no
   distinguished_name = my_dn
                       
   [ my_dn ]
   commonName = test_signer@amazon.com
                       
   [ my_exts ]
   keyUsage         = digitalSignature
   extendedKeyUsage = codeSigning
   ```

1. ECDSA 코드 서명 프라이빗 키를 생성합니다.

   ```
   openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -pkeyopt ec_param_enc:named_curve -outform PEM -out ecdsasigner.key
   ```

1. ECDSA 코드 서명 인증서를 생성합니다.

   ```
   openssl req -new -x509 -config cert_config.txt -extensions my_exts -nodes -days 365 -key ecdsasigner.key -out ecdsasigner.crt
   ```

1. 코드 서명 인증서, 프라이빗 키 및 인증서 체인을 AWS Certificate Manager다음으로 가져옵니다.

   ```
   aws acm import-certificate --certificate fileb://ecdsasigner.crt --private-key fileb://ecdsasigner.key
   ```

   이 명령은 인증서에 대한 ARN을 표시합니다. OTA 업데이트 작업을 생성할 때 이 ARN이 필요합니다.
**참고**  
이 단계는 용 코드 서명을 사용하여 펌웨어 이미지에 서명한다는 가정하 AWS IoT 에 작성되었습니다. 용 코드 서명을 사용하는 AWS IoT 것이 좋지만 펌웨어 이미지에 수동으로 서명할 수 있습니다.

# Nordic nrf52840-dk에 대한 코드 서명 인증서 생성
<a name="ota-code-sign-cert-nordic"></a>

**중요**  <a name="deprecation-message"></a>
이 라이브러리는 더 이상 사용되지 않는 Amazon-FreeRTOS 리포지토리에서 호스팅됩니다. 새 프로젝트를 생성할 때는 [여기서 시작](freertos-getting-started-modular.md)하는 것이 좋습니다. 현재 사용되지 않는 Amazon-FreeRTOS 리포지토리를 기반으로 하는 기존 FreeRTOS 프로젝트가 이미 있는 경우에는 [Amazon-FreeRTOS Github 리포지토리 마이그레이션 가이드](github-repo-migration.md) 섹션을 참조하세요.

Nordic nrf52840-dk는 ECDSA 코드 서명 인증서로 자체 서명된 SHA256을 지원합니다.

**참고**  
코드 서명 인증서를 생성하려면 컴퓨터에 [OpenSSL](https://www.openssl.org/)을 설치합니다. OpenSSL을 설치한 후 명령 프롬프트나 터미널 환경에서 `openssl`이 OpenSSL 실행 파일에 할당되었는지 확인합니다.  
 AWS Command Line Interface 를 사용하여 코드 서명 인증서, 프라이빗 키 및 인증서 체인을 로 가져옵니다 AWS Certificate Manager. 설치에 대한 자세한 내용은 설치를 AWS CLI참조하세요. [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) 

1. 작업 디렉터리에서 다음 텍스트를 사용하여 `cert_config.txt` 파일을 생성합니다. *test\$1signer@amazon.com*을 사용자의 이메일 주소로 바꿉니다.

   ```
   [ req ]
   prompt             = no
   distinguished_name = my_dn
                       
   [ my_dn ]
   commonName = test_signer@amazon.com
                       
   [ my_exts ]
   keyUsage         = digitalSignature
   extendedKeyUsage = codeSigning
   ```

1. ECDSA 코드 서명 프라이빗 키를 생성합니다.

   ```
   openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -pkeyopt ec_param_enc:named_curve -outform PEM -out ecdsasigner.key
   ```

1. ECDSA 코드 서명 인증서를 생성합니다.

   ```
   openssl req -new -x509 -config cert_config.txt -extensions my_exts -nodes -days 365 -key ecdsasigner.key -out ecdsasigner.crt
   ```

1. 코드 서명 인증서, 프라이빗 키 및 인증서 체인을 AWS Certificate Manager다음으로 가져옵니다.

   ```
   aws acm import-certificate --certificate fileb://ecdsasigner.crt --private-key fileb://ecdsasigner.key
   ```

   이 명령은 인증서에 대한 ARN을 표시합니다. OTA 업데이트 작업을 생성할 때 이 ARN이 필요합니다.
**참고**  
이 단계는 용 코드 서명을 사용하여 펌웨어 이미지에 서명한다는 가정하 AWS IoT 에 작성되었습니다. 용 코드 서명을 사용하는 AWS IoT 것이 좋지만 펌웨어 이미지에 수동으로 서명할 수 있습니다.

# FreeRTOS Windows 시뮬레이터용 코드 서명 인증서 생성
<a name="ota-code-sign-cert-win"></a>

FreeRTOS Windows 시뮬레이터에서 OTA 업데이트를 수행하려면 ECDSA P-256 키 및 SHA-256 해시와 함께 코드 서명 인증서가 필요합니다. 코드 서명 인증서가 없는 경우 다음 단계를 따라 인증서를 생성합니다.

**참고**  
코드 서명 인증서를 생성하려면 컴퓨터에 [OpenSSL](https://www.openssl.org/)을 설치합니다. OpenSSL을 설치한 후 명령 프롬프트나 터미널 환경에서 `openssl`이 OpenSSL 실행 파일에 할당되었는지 확인합니다.  
 AWS Command Line Interface 를 사용하여 코드 서명 인증서, 프라이빗 키 및 인증서 체인을 로 가져옵니다 AWS Certificate Manager. 설치에 대한 자세한 내용은 설치를 AWS CLI참조하세요. [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) 

1. 작업 디렉터리에서 다음 텍스트를 사용하여 `cert_config.txt` 파일을 생성합니다. *test\$1signer@amazon.com*을 사용자의 이메일 주소로 바꿉니다.

   ```
   [ req ]
   prompt             = no
   distinguished_name = my_dn
                       
   [ my_dn ]
   commonName = test_signer@amazon.com
                       
   [ my_exts ]
   keyUsage         = digitalSignature
   extendedKeyUsage = codeSigning
   ```

1. ECDSA 코드 서명 프라이빗 키를 생성합니다.

   ```
   openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -pkeyopt ec_param_enc:named_curve -outform PEM -out ecdsasigner.key
   ```

1. ECDSA 코드 서명 인증서를 생성합니다.

   ```
   openssl req -new -x509 -config cert_config.txt -extensions my_exts -nodes -days 365 -key ecdsasigner.key -out ecdsasigner.crt
   ```

1. 코드 서명 인증서, 프라이빗 키 및 인증서 체인을 AWS Certificate Manager다음으로 가져옵니다.

   ```
   aws acm import-certificate --certificate fileb://ecdsasigner.crt --private-key fileb://ecdsasigner.key
   ```

   이 명령은 인증서에 대한 ARN을 표시합니다. OTA 업데이트 작업을 생성할 때 이 ARN이 필요합니다.
**참고**  
이 단계는 용 코드 서명을 사용하여 펌웨어 이미지에 서명한다는 가정하 AWS IoT 에 작성되었습니다. 용 코드 서명을 사용하는 AWS IoT 것이 좋지만 펌웨어 이미지에 수동으로 서명할 수 있습니다.

# 사용자 지정 하드웨어에 대한 코드 서명 인증서 생성
<a name="ota-code-sign-cert-other"></a>

적절한 도구 세트를 사용하여 하드웨어에 대해 자체 서명된 인증서와 프라이빗 키를 생성합니다.

 AWS Command Line Interface 를 사용하여 코드 서명 인증서, 프라이빗 키 및 인증서 체인을 로 가져옵니다 AWS Certificate Manager. 설치에 대한 자세한 내용은 설치를 AWS CLI참조하세요. [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) 

코드 서명 인증서를 생성한 후 AWS CLI 를 사용하여 ACM으로 가져올 수 있습니다.

```
aws acm import-certificate --certificate fileb://code-sign.crt --private-key fileb://code-sign.key
```

이 명령의 출력에는 인증서에 대한 ARN이 표시됩니다. OTA 업데이트 작업을 생성할 때 이 ARN이 필요합니다.

ACM에서 특정 알고리즘 및 키 크기를 사용하려면 인증서가 필요합니다. 자세한 내용은 [인증서를 가져오기 위한 사전 조건](https://docs.aws.amazon.com/acm/latest/userguide/import-certificate-prerequisites.html)을 참조하십시오. ACM에 대한 자세한 내용은 [AWS Certificate Manager으로 인증서 가져오기](https://docs.aws.amazon.com/acm/latest/userguide/import-certificate.html)를 참조하세요.

코드 서명 인증서의 내용을 복사하여 나중에 다운로드할 FreeRTOS 코드의 일부인 `vendors/vendor/boards/board/aws_demos/config_files/ota_demo_config.h` 파일에 붙여넣고 서식을 지정해야 합니다.

# 에 대한 코드 서명에 대한 액세스 권한 부여 AWS IoT
<a name="code-sign-policy"></a>

액세스 권한을 제공하려면 사용자, 그룹 또는 역할에 권한을 추가하세요.
+ 의 사용자 및 그룹 AWS IAM Identity Center:

  권한 세트를 생성합니다. *AWS IAM Identity Center 사용자 안내서*에서 [권한 세트 생성](https://docs.aws.amazon.com//singlesignon/latest/userguide/howtocreatepermissionset.html)의 지침을 따릅니다.
+ ID 제공업체를 통해 IAM에서 관리되는 사용자:

  ID 페더레이션을 위한 역할을 생성합니다. *IAM 사용자 설명서*의 [Create a role for a third-party identity provider (federation)](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-idp.html)의 지침을 따릅니다.
+ IAM 사용자:
  + 사용자가 맡을 수 있는 역할을 생성합니다. *IAM 사용자 설명서*에서 [Create a role for an IAM user](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-user.html)의 지침을 따릅니다.
  + (권장되지 않음) 정책을 사용자에게 직접 연결하거나 사용자를 사용자 그룹에 추가합니다. *IAM 사용 설명서*에서 [사용자(콘솔)에 권한 추가](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_users_change-permissions.html#users_change_permissions-add-console)의 지침을 따릅니다.

# OTA 라이브러리와 함께 FreeRTOS 다운로드
<a name="ota-download-freertos"></a>

[GitHub](https://github.com/freertos/freertos)에서 FreeRTOS를 복제하거나 다운로드할 수 있습니다. 자세한 내용은 [README.md](https://github.com/freertos/freertos/blob/main/README.md) 파일을 참조하십시오.

OTA 데모 애플리케이션 설정 및 실행에 대한 자세한 내용은 [OTA(Over-the-Air) 업데이트 데모 애플리케이션](ota-demo.md) 단원을 참조하십시오.

**중요**  
이 주제에서는 FreeRTOS 다운로드 디렉터리의 경로를 `freertos`이라고 합니다.
`freertos` 경로의 공백 문자로 인해 빌드 실패가 발생할 수 있습니다. 리포지토리를 복제하거나 복사할 때 생성하는 경로에 공백 문자가 없어야 합니다.
Microsoft Windows에서 파일 경로의 최대 길이는 260자입니다. FreeRTOS 다운로드 디렉터리 경로가 길면 빌드 오류가 발생할 수 있습니다.
소스 코드에 심볼 링크가 포함될 수 있으므로 Windows를 사용하여 아카이브를 추출하는 경우 다음을 수행해야 할 수 있습니다.  
[개발자 모드](https://docs.microsoft.com/en-us/windows/apps/get-started/enable-your-device-for-development)를 활성화합니다. 또는,
관리자 권한으로 승격된 콘솔을 사용합니다.
이렇게 하면 Windows에서 아카이브를 추출할 때 심볼 링크를 제대로 생성할 수 있습니다. 그렇지 않으면 심볼 링크는 심볼 링크의 경로를 텍스트로 포함하는 일반 파일 또는 비어 있는 일반 파일로 작성됩니다. 자세한 내용은 [Symlinks in Windows 10\$1](https://blogs.windows.com/windowsdeveloper/2016/12/02/symlinks-windows-10/) 블로그 항목을 참조하세요.  
Windows에서 Git을 사용하는 경우 개발자 모드를 활성화하거나 다음을 수행해야 합니다.  
다음 명령을 사용하여 `core.symlinks`를 true로 설정합니다.  

    ```
    git config --global core.symlinks true
    ```
시스템에 쓰는 git 명령(예: **git pull**, **git clone** 및**git submodule update --init --recursive**)을 사용할 때마다 관리자 권한으로 승격되는 콘솔을 사용하세요.

# MQTT를 사용한 OTA 업데이트 사전 조건
<a name="ota-mqtt-freertos"></a>

이 단원에서는 MQTT를 사용하여 무선 업데이트(OTA)를 수행하기 위한 일반적인 요구 사항에 대해 설명합니다.

## 최소 요구 사항
<a name="ota-mqtt-freertos-min-requirements"></a>
+ 디바이스 펌웨어에는 필요한 FreeRTOS 라이브러리(coreMQTT 에이전트, OTA 업데이트 및 해당 종속성)가 포함되어 있어야 합니다.
+ FreeRTOS 버전 1.4.0 이상이 필요합니다. 하지만 가능한 경우 최신 버전을 사용하는 것이 좋습니다.

## 구성
<a name="ota-mqtt-freertos-config"></a>

버전 201912.00부터 FreeRTOS OTA는 HTTP 또는 MQTT 프로토콜을 사용하여 펌웨어 업데이트 이미지를에서 디바이스 AWS IoT 로 전송할 수 있습니다. FreeRTOS에서 OTA 업데이트를 생성할 때 두 프로토콜을 모두 지정하면 각 디바이스에서 이미지를 전송하는 데 사용되는 프로토콜을 결정합니다. 자세한 정보는 [HTTP를 사용한 OTA 업데이트 사전 조건](ota-http-freertos.md)을 참조하세요.

기본적으로 [https://github.com/aws/amazon-freertos/blob/main/vendors/vendor/boards/board/aws_demos/config_files/ota_config.h](https://github.com/aws/amazon-freertos/blob/main/vendors/vendor/boards/board/aws_demos/config_files/ota_config.h)의 OTA 프로토콜은 MQTT 프로토콜을 사용하도록 구성되어 있습니다.

## 디바이스별 구성
<a name="ota-mqtt-freertos-dev-config"></a>

없음.

## 메모리 사용량
<a name="ota-mqtt-freertos-memory"></a>

MQTT를 데이터 전송에 사용하는 경우, 제어 작업과 데이터 작업 간에 공유되므로 MQTT 연결을 위한 추가 힙 메모리가 필요하지 않습니다.

## 디바이스 정책
<a name="ota-mqtt-freertos-device-policy"></a>

MQTT를 사용하여 OTA 업데이트를 수신하는 각 디바이스는에 사물로 등록되어야 하며 AWS IoT 사물에는 여기에 나열된 것과 같은 연결된 정책이 있어야 합니다. `"Action"` 및 `"Resource"` 객체의 항목에 대한 자세한 내용은 [AWS IoT 핵심 정책 작업](https://docs.aws.amazon.com/iot/latest/developerguide/iot-policy-actions.html) 및 [AWS IoT 핵심 작업 리소스](https://docs.aws.amazon.com/iot/latest/developerguide/iot-action-resources.html)에서 확인할 수 있습니다.

**참고**
+ `iot:Connect` 권한을 통해 디바이스는 MQTT를 AWS IoT 통해에 연결할 수 있습니다.
+  AWS IoT 작업 주제에 대한 `iot:Subscribe` 및 `iot:Publish` 권한(`.../jobs/*`)을 사용하면 연결된 디바이스가 작업 알림 및 작업 문서를 수신하고 작업 실행의 완료 상태를 게시할 수 있습니다.
+  AWS IoT OTA 스트림(`.../streams/*`) 주제에 대한 `iot:Subscribe` 및 `iot:Publish` 권한을 사용하면 연결된 디바이스가 OTA 업데이트 데이터를 가져올 수 있습니다 AWS IoT. MQTT를 통해 펌웨어 업데이트를 수행하려면 이러한 권한이 필요합니다.
+ `iot:Receive` 권한을 통해 AWS IoT Core 는 해당 주제에 대한 메시지를 연결된 디바이스에 게시할 수 있습니다. MQTT 메시지를 전송할 때마다 이 권한을 확인합니다. 이 권한을 사용하면 주제를 현재 구독 중인 클라이언트에 대한 액세스 권한을 취소할 수 있습니다.

# HTTP를 사용한 OTA 업데이트 사전 조건
<a name="ota-http-freertos"></a>

이 단원에서는 HTTP를 사용하여 무선 업데이트(OTA)를 수행하기 위한 일반적인 요구 사항에 대해 설명합니다. 버전 201912.00부터 FreeRTOS OTA는 HTTP 또는 MQTT 프로토콜을 사용하여 펌웨어 업데이트 이미지를에서 디바이스 AWS IoT 로 전송할 수 있습니다.

**참고**  
HTTP 프로토콜을 사용하여 펌웨어 이미지를 전송할 수 있지만 작업 실행 알림, 작업 문서 및 실행 상태 업데이트 전송 또는 수신을 포함하여 와의 다른 상호 작용 coreMQTT에서 coreMQTT 에이전트 라이브러리를 AWS IoT Core 사용하기 때문에 coreMQTT 에이전트 라이브러리는 여전히 필요합니다. coreMQTT 
OTA 업데이트 작업에 대해 MQTT 및 HTTP 프로토콜을 모두 지정하는 경우 각 디바이스의 OTA 에이전트 소프트웨어 설정에 따라 펌웨어 이미지를 전송하는 데 사용되는 프로토콜이 결정됩니다. OTA 에이전트를 기본 MQTT 프로토콜 메서드에서 HTTP 프로토콜로 변경하려면 디바이스의 FreeRTOS 소스 코드를 컴파일하는 데 사용되는 헤더 파일을 수정할 수 있습니다.

## 최소 요구 사항
<a name="ota-http-freertos-min-requirements"></a>
+ 디바이스 펌웨어에는 필요한 FreeRTOS 라이브러리(coreMQTT 에이전트, HTTP, OTA 에이전트 및 해당 종속성)가 포함되어 있어야 합니다.
+ OTA 프로토콜의 구성을 변경하여 HTTP를 통한 OTA 데이터 전송을 활성화하려면 FreeRTOS 버전 201912.00 이상이 필요합니다.

## 구성
<a name="ota-http-freertos-config"></a>

[https://github.com/aws/amazon-freertos/blob/main/vendors/vendor/boards/board/aws_demos/config_files/ota_config.h](https://github.com/aws/amazon-freertos/blob/main/vendors/vendor/boards/board/aws_demos/config_files/ota_config.h) 파일에서 다음과 같은 OTA 프로토콜 구성을 참조하십시오.

**HTTP를 통한 OTA 데이터 전송을 활성화하려면**

1. `configENABLED_DATA_PROTOCOLS`를 `OTA_DATA_OVER_HTTP`로 변경합니다.

1. OTA가 업데이트되면 MQTT 또는 HTTP 프로토콜을 사용할 수 있도록 두 프로토콜을 모두 지정할 수 있습니다. `configOTA_PRIMARY_DATA_PROTOCOL`을 `OTA_DATA_OVER_HTTP`로 변경하여 디바이스에서 사용하는 기본 프로토콜을 HTTP로 설정할 수 있습니다.

**참고**  
HTTP는 OTA 데이터 작업에만 지원됩니다. 제어 작업의 경우 MQTT를 사용해야 합니다.

## 디바이스별 구성
<a name="ota-http-freertos-device-configuration"></a>

**ESP32**  
RAM 양의 제한으로 인해 HTTP를 OTA 데이터 프로토콜로 활성화할 때는 BLE를 꺼야 합니다. [https://github.com/aws/amazon-freertos/blob/main/vendors/espressif/boards/esp32/aws_demos/config_files/aws_iot_network_config.h](https://github.com/aws/amazon-freertos/blob/main/vendors/espressif/boards/esp32/aws_demos/config_files/aws_iot_network_config.h) 파일에서 `configENABLED_NETWORKS`를 `AWSIOT_NETWORK_TYPE_WIFI` 전용으로 변경합니다.  

```
/**
     * @brief Configuration flag which is used to enable one or more network interfaces for a board.
     *
     * The configuration can be changed any time to keep one or more network enabled or disabled.
     * More than one network interfaces can be enabled by using 'OR' operation with flags for
     * each network types supported. Flags for all supported network types can be found
     * in "aws_iot_network.h"
     *
     */
    #define configENABLED_NETWORKS      ( AWSIOT_NETWORK_TYPE_WIFI )
```

## 메모리 사용량
<a name="ota-http-freertos-memory"></a>

MQTT를 데이터 전송에 사용하는 경우 제어 및 데이터 작업 간에 공유되므로 MQTT 연결에 추가 힙 메모리가 필요하지 않습니다. 그러나 HTTP를 통해 데이터를 전송하려면 추가 힙 메모리가 필요합니다. 다음은 FreeRTOS `xPortGetFreeHeapSize` API를 사용하여 계산된 모든 지원되는 플랫폼의 힙 메모리 사용량 데이터입니다. OTA 라이브러리를 사용하기에 충분한 RAM이 있는지 확인해야 합니다.

****Texas Instruments CC3220SF-LAUNCHXL****  
제어 작업(MQTT): 12KB  
데이터 작업(HTTP): 10KB  
 TI는 하드웨어에서 SSL을 수행하기 때문에 RAM을 훨씬 적게 사용하므로 mbedtls 라이브러리를 사용하지 않습니다.

****Microchip Curiosity PIC32MZEF****  
제어 작업(MQTT): 65KB  
데이터 작업(HTTP): 43KB

****Espressif ESP32****  
제어 작업(MQTT): 65KB  
데이터 작업(HTTP): 45KB  
ESP32의 BLE는 약 87KB의 RAM을 사용합니다. 위의 디바이스별 구성에서 언급한 모든 내용을 활성화할 수 있는 RAM이 충분하지 않습니다.

****Windows 시뮬레이터****  
제어 작업(MQTT): 82KB   
데이터 작업(HTTP): 63KB 

****Nordic nrf52840-dk****  
HTTP는 지원되지 않습니다.

## 디바이스 정책
<a name="ota-http-freertos-device-policy"></a>

이 정책을 사용하면 OTA 업데이트에 MQTT 또는 HTTP를 사용할 수 있습니다.

HTTP를 사용하여 OTA 업데이트를 수신하는 각 디바이스는 AWS IoT 에 항목으로 등록되어야 하며, 여기에 나열된 것과 같은 연결 정책이 있어야 합니다. `"Action"` 및 `"Resource"` 객체의 항목에 대한 자세한 내용은 [AWS IoT 핵심 정책 작업](https://docs.aws.amazon.com/iot/latest/developerguide/iot-policy-actions.html) 및 [AWS IoT 핵심 작업 리소스](https://docs.aws.amazon.com/iot/latest/developerguide/iot-action-resources.html)에서 확인할 수 있습니다.

**참고**
+ `iot:Connect` 권한을 사용하면 MQTT를 통해 디바이스를 AWS IoT 에 연결할 수 있습니다.
+  AWS IoT 작업 주제에 대한 `iot:Subscribe` 및 `iot:Publish` 권한(`.../jobs/*`)을 사용하면 연결된 디바이스가 작업 알림 및 작업 문서를 수신하고 작업 실행의 완료 상태를 게시할 수 있습니다.
+ `iot:Receive` 권한을 통해 AWS IoT Core 는 해당 주제에 대한 메시지를 현재 연결된 디바이스에 게시할 수 있습니다. MQTT 메시지를 전송할 때마다 이 권한을 확인합니다. 이 권한을 사용하면 주제를 현재 구독 중인 클라이언트에 대한 액세스 권한을 취소할 수 있습니다.