

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

# corePKCS11 라이브러리
<a name="security-pkcs"></a>

**참고**  <a name="out-of-date-message"></a>
이 페이지의 내용은 최신 상태가 아닐 수 있습니다. 최신 업데이트는 [Freertos.org 라이브러리 페이지](https://www.freertos.org/Documentation/03-Libraries/01-Library-overview/01-All-libraries)를 참조하세요.

## 개요
<a name="freertos-pkcs-overview"></a>

퍼블릭 키 암호화 표준 \#11은 암호화 토큰을 관리하고 사용하기 위한 플랫폼 독립적 API를 정의합니다. [PKCS \#11](https://en.wikipedia.org/wiki/PKCS_11)은 표준에서 정의한 API와 표준 자체를 의미합니다. PKCS \#11 암호화 API는 키 스토리지, 암호화 객체에 대한 get/set 속성 및 세션 의미 체계를 추상화합니다. 이는 일반적인 암호화 객체를 조작하는 데 널리 사용되며, 지정한 함수를 통해 애플리케이션 소프트웨어가 암호화 객체를 애플리케이션 메모리에 노출하지 않고도 사용, 생성, 수정 및 삭제할 수 있기 때문에 중요합니다. 예를 들어 FreeRTOS AWS 참조 통합은 PKCS \#11 API의 작은 하위 집합을 사용하여 애플리케이션이 키를 '보지' 않고 [TLS(전송 계층 보안) 프로토콜로 인증되고 보호되는 네트워크 연결을 생성하는 데 필요한 보안 암호(프라이빗)](https://en.wikipedia.org/wiki/Transport_Layer_Security) 키에 액세스합니다.

corePKCS11 라이브러리에는 Mbed TLS에서 제공하는 암호화 기능을 사용하는 PKCS \#11 인터페이스(API)의 소프트웨어 기반 모의 구현이 포함되어 있습니다. 소프트웨어 모의를 사용하면 개발 속도 및 유연성이 향상되지만, 모의 객체를 프로덕션 디바이스에 사용되는 보안 키 스토리지 전용 구현으로 대체해야 합니다. 일반적으로 TPM(신뢰 플랫폼 모듈), HSM(하드웨어 보안 모듈), Secure Element와 같은 보안 암호화 프로세서 또는 기타 보안 하드웨어 엔클레이브의 공급업체는 하드웨어와 함께 PKCS \#11 구현을 배포합니다. 따라서 corePKCS11 소프트웨어 전용 모의 라이브러리의 목적은 프로덕션 디바이스에서 암호화 프로세서 전용 PKCS \#11 구현으로 전환하기 전에 신속한 프로토타이핑 및 개발을 가능하게 하는 비 하드웨어 전용 PKCS \#11 구현을 제공하는 것입니다.

비대칭 키, 난수 생성, 해싱 등 PKCS \#11 표준의 일부만 구현됩니다. 대상 사용 사례에는 소형 임베디드 디바이스에서의 TLS 인증을 위한 인증서 및 키 관리, 코드 서명 확인 등이 포함됩니다. FreeRTOS 소스 코드 리포지토리에서 OASIS 표준 기구로부터 가져온 `pkcs11.h` 파일을 참조하세요. [FreeRTOS 참조 구현](https://docs.aws.amazon.com/embedded-csdk/latest/lib-ref/libraries/standard/corePKCS11/docs/doxygen/output/html/index.html)에서는 TLS 헬퍼 인터페이스가 `SOCKETS_Connect` 중에 TLS 클라이언트 인증을 위해 PKCS \#11 API를 호출합니다. 1회 개발자 프로비저닝 워크플로우에서 인증을 위한 프라이빗 키와 TLS 클라이언트 인증서를 AWS IoT MQTT 브로커로 가져오기 위해서도 PKCS\#11 API를 호출합니다. 이 두 사용 사례(프로비저닝 및 TLS 클라이언트 인증)에서는 PKCS\#11 인터페이스 표준의 일부만 구현하면 됩니다.

## 특성
<a name="freertos-pcks-features"></a>

PKCS\#11의 다음 하위 집합이 사용됩니다. 이 목록은 프로비저닝, TLS 클라이언트 인증 및 정리를 지원하기 위해 루틴을 호출하는 순서와 거의 동일합니다. 함수에 대한 자세한 내용은 표준 위원회에서 제공하는 PKCS\#11 문서를 참조하세요.

### 일반 설정 및 제거 API
<a name="pkcs-required-setup-teardown"></a>
+ `C_Initialize`
+ `C_Finalize`
+ `C_GetFunctionList`
+ `C_GetSlotList`
+ `C_GetTokenInfo`
+ `C_OpenSession`
+ `C_CloseSession`
+ `C_Login`

### 프로비저닝 API
<a name="pkcs-required-provisioning"></a>
+ `C_CreateObject CKO_PRIVATE_KEY`(디바이스 프라이빗 키용)
+ `C_CreateObject CKO_CERTIFICATE`(디바이스 인증서 및 코드 확인 인증서용)
+ `C_GenerateKeyPair`
+ `C_DestroyObject`

### 클라이언트 인증
<a name="pkcs-required-client-auth"></a>
+ `C_GetAttributeValue`
+ `C_FindObjectsInit`
+ `C_FindObjects`
+ `C_FindObjectsFinal`
+ `C_GenerateRandom`
+ `C_SignInit`
+ `C_Sign`
+ `C_VerifyInit`
+ `C_Verify`
+ `C_DigestInit`
+ `C_DigestUpdate`
+ `C_DigestFinal`

## 비대칭 암호화 지원
<a name="pkcs-asym-crypto"></a>

FreeRTOS 참조 구현은 PKCS \#11 2048비트 RSA(서명 전용) 및 NIST P-256 곡선의 ECDSA를 사용합니다. 다음 지침에서는 P-256 클라이언트 인증서를 기반으로 AWS IoT 사물을 생성하는 방법을 설명합니다.

다음(또는 최신) 버전의 AWS CLI 및 OpenSSL을 사용하고 있는지 확인합니다.

```
aws --version
aws-cli/1.11.176 Python/2.7.9 Windows/8 botocore/1.7.34

openssl version
OpenSSL 1.0.2g  1 Mar 2016
```

다음 절차에서는 `aws configure` 명령을 사용하여 AWS CLI를 구성했다고 가정합니다. 자세한 내용은 *AWS Command Line Interface 사용 설명서*에서 [`aws configure`를 사용한 빠른 구성](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)을 참조하세요.

**P-256 클라이언트 인증서를 기반으로 AWS IoT 사물을 생성하려면**

1.  AWS IoT 사물을 생성합니다.

   ```
   aws iot create-thing --thing-name {{thing-name}}
   ```

1. OpenSSL을 사용해 P-256 키를 생성합니다.

   ```
   openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -pkeyopt ec_param_enc:named_curve -outform PEM -out {{thing-name}}.key
   ```

1. 2단계에서 생성한 키로 서명된 인증서 등록 요청을 생성합니다.

   ```
   openssl req -new -nodes -days 365 -key {{thing-name}}.key -out {{thing-name}}.req
   ```

1. 인증서 등록 요청을에 제출합니다 AWS IoT.

   ```
   aws iot create-certificate-from-csr  \
     --certificate-signing-request file://{{thing-name}}.req --set-as-active  \
     --certificate-pem-outfile {{thing-name}}.crt
   ```

1. (이전 명령에서 출력된 ARN에서 참조되는) 인증서를 사물에 연결합니다.

   ```
   aws iot attach-thing-principal --thing-name {{thing-name}} \
     --principal "arn:aws:iot:{{us-east-1}}:{{123456789012}}:cert/{{86e41339a6d1bbc67abf31faf455092cdebf8f21ffbc67c4d238d1326c7de729}}"
   ```

1. 정책을 생성합니다. (이 정책은 지나치게 허용적입니다. 개발 목적으로만 사용해야 합니다.)

   ```
   aws iot create-policy --policy-name FullControl --policy-document file://policy.json
   ```

   다음은 `create-policy` 명령에 지정되는 policy.json 파일 목록입니다. Greengrass 연결 및 검색을 위해 FreeRTOS 데모를 실행하지 않으려면 `greengrass:*` 작업을 생략할 수 있습니다.

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": "iot:*",
         "Resource": "*"
       },
       {
         "Effect": "Allow",
         "Action": "greengrass:*",
         "Resource": "*"
       }
     ]
   }
   ```

------

1. 보안 주체(인증서) 및 정책을 사물에 연결합니다.

   ```
   aws iot attach-principal-policy --policy-name FullControl \
     --principal "arn:aws:iot:us-east-1:{{123456789012}}:cert/{{86e41339a6d1bbc67abf31faf455092cdebf8f21ffbc67c4d238d1326c7de729}}"
   ```

이제 이 안내서의 [AWS IoT 시작하기](https://docs.aws.amazon.com/iot/latest/developerguide/iot-gs.html) 단원에 나오는 단계를 따릅니다. 생성한 인증서 및 프라이빗 키를 `aws_clientcredential_keys.h` 파일에 복사해야 합니다. 사물 이름을 `aws_clientcredential.h`에 복사합니다.

**참고**  
인증서와 프라이빗 키는 데모 용도로만 하드 코딩됩니다. 프로덕션 수준 애플리케이션은 이러한 파일을 보안 위치에 저장해야 합니다.

## 이식
<a name="freertos-pkcs-porting"></a>

corePKCS11 라이브러리를 플랫폼으로 이식하는 방법에 대한 자세한 내용은 FreeRTOS 이식 안내서의 [corePKCS11 라이브러리 이식](https://docs.aws.amazon.com/freertos/latest/portingguide/afr-porting-pkcs.html)을 참조하세요.

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


****  
<a name="corePKCS11-memory-estimate"></a>
<table>
<thead>
  <tr><th colspan="3">corePKCS11 코드 크기(ARM Cortex-M용 GCC로 생성된 예제)</th></tr>
  <tr><th>파일</th><th>-O1 최적화</th><th>-Os 최적화</th></tr>
</thead>
<tbody>
  <tr><td>core\_pkcs11.c</td><td>0.8K</td><td>0.8K</td></tr>
  <tr><td>core\_pki\_utils.c</td><td>0.5K</td><td>0.3K</td></tr>
  <tr><td>core\_pkcs11\_mbedtls.c</td><td>8.9K</td><td>7.5K</td></tr>
  <tr><td>총 추정치</td><td>10.2K</td><td>8.6K</td></tr>
</tbody>
</table>
