

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 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 は、キーストレージ、暗号化オブジェクトプロパティの取得/設定、およびセッションセマンティクスを抽象化します。この API は、一般的な暗号化オブジェクトの操作に広く使用されており、重要です。この API で指定する関数により、アプリケーションソフトウェアは暗号化オブジェクトの使用、作成、変更、削除を、アプリケーションのメモリに公開することなく実行できるからです。例えば、FreeRTOS AWS リファレンス統合は PKCS \#11 API の小さなサブセットを使用して、アプリケーションがキーを「見る」ことなく [Transport Layer Security (TLS) プロトコルによって認証および保護されるネットワーク接続の作成に必要なシークレット (プライベート)](https://en.wikipedia.org/wiki/Transport_Layer_Security) キーにアクセスします。

corePKCS11 ライブラリには、Mbed TLS が提供する暗号化機能を使用する PKCS \#11 インターフェイス (API) のソフトウェアベースのモック実装が含まれています。ソフトウェアモックを使用すると、迅速な開発と柔軟性が実現できますが、このモックを実稼働用デバイスで使用されるセキュアキーストレージ固有の実装に置き換える必要があります。一般に、トラステッドプラットフォームモジュール (TPM)、ハードウェアセキュリティモジュール (HSM)、セキュアエレメント、またはその他のタイプのセキュアハードウェアエンクレーブなどのセキュアな暗号化プロセッサのベンダーは、PKCS \#11 実装をハードウェアとともに配布します。したがって、corePKCS11 ソフトウェア専用モックライブラリの目的は、実稼働デバイスで暗号化プロセッサ固有の PKCS \#11 実装に切り替える前に、迅速なプロトタイピングと開発ができるハードウェア専用ではない PKCS \#11 実装を提供することです。

PKCS \#11 標準のサブセットのみが実装されており、非対称キー、乱数生成、ハッシュなどの操作に重点が置かれています。対象となるユースケースには、小型の組み込みデバイスにおける TLS 認証に対応した証明書とキーの管理、およびコードサイン署名の検証などがあります。FreeRTOS ソースコードリポジトリのファイル `pkcs11.h` (標準的な本体である OASIS から入手) を参照してください。[FreeRTOS リファレンス実装](https://docs.aws.amazon.com/embedded-csdk/latest/lib-ref/libraries/standard/corePKCS11/docs/doxygen/output/html/index.html)では、`SOCKETS_Connect` 中に TLS クライアントの認証を実行するために、PKCS \#11 API コールが TLS ヘルパーインターフェイスによって使用されます。PKCS \#11 API コールは、ワンタイムの開発者プロビジョニングワークフローによって、 AWS IoT MQTT ブローカーへの認証用 TLS クライアント証明書とプライベートキーをインポートするためにも使用されます。プロビジョニングと TLS クライアント認証の 2 つのユースケースでは、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 リファレンス実装では、NIST P-256 曲線を使用する PKCS \#11 2048 ビット RSA (署名のみ) と 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.8 K</td><td>0.8 K</td></tr>
  <tr><td>core\_pki\_utils.c</td><td>0.5 K</td><td>0.3 K</td></tr>
  <tr><td>core\_pkcs11\_mbedtls.c</td><td>8.9 K</td><td>7.5 K</td></tr>
  <tr><td>合計 (概算)</td><td>10.2K</td><td>8.6K</td></tr>
</tbody>
</table>
