

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 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 属性和会话语义。该 API 广泛用于操作常见加密对象，它之所以重要，是因为它指定的函数允许应用程序软件使用、创建、修改和删除加密对象，而无需将这些对象在应用程序的内存中公开这些对象。例如，Fre AWS eRTOS 参考集成使用 PKCS \#11 API 的一小部分来访问创建由[传输层安全 (TLS) 协议进行身份验证和保护的网络连接所必需的秘密（私有）密钥，而应用程序 “看到” 该](https://en.wikipedia.org/wiki/Transport_Layer_Security)密钥不会 “看见” 该密钥。

corePKCS11 库包含 PKCS \#11 接口 (API) 的基于软件的模拟实现，该接口使用 Mbed TLS 提供的加密功能。使用软件模拟可实现快速开发并提高灵活性，但预计您将使用专门针对生产设备中使用的安全密钥存储的实现来取代模拟。通常，安全加密处理器（例如，可信平台模块 (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)中，PKCS\#11 API 调用由 TLS 帮助程序接口生成，目的是为了在 `SOCKETS_Connect` 过程中执行 TLS 客户端身份验证。PKCS \#11 API 调用也可以由一次性开发人员预置工作流程生成，以将用于身份验证的 TLS 客户端证书和私有密钥导入至 AWS IoT MQTT 代理。以上两个使用案例（预置和 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 曲线的 ECDSA。 P-256 以下说明描述了如何基于 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)。**

**要创建 AWS IoT 基于 P-256 客户证书的东西**

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 文件的列表。如果不希望运行 FreeRTOS 演示以进行 Greengrass 连接和发现，可以忽略 `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` 中。

**注意**  
证书和私钥是硬编码的，仅用于演示目的。 Production-level 应用程序应将这些文件存储在安全的位置。

## 移植
<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 的 GCC 生成的示例） Cortex-M</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>
