公有密钥加密标准 (PKCS) #11 库 - FreeRTOS
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

公有密钥加密标准 (PKCS) #11 库

概览

公有密钥加密标准 #11 (PKCS#11) 是一个加密 API,用于提取密钥存储、加密对象的 get/set 属性以及会话语义。请参阅 FreeRTOS 源代码存储库中的 pkcs11.h(获取自 OASIS,标准正文)。在 FreeRTOS 参考实施中,PKCS#11 API 调用由 TLS 帮助程序接口生成,目的是为了在 SOCKETS_Connect 期间执行 TLS 客户端身份验证。PKCS#11 API 调用也可以由一次性开发人员预置工作流程生成,以将用于身份验证的 TLS 客户端证书和私有密钥导入至 AWS IoT MQTT 代理。以上两个使用案例(预置和 TLS 客户端身份验证)都只需要实施 PKCS#11 接口标准的一小部分。

功能

下面列出了使用的部分 PKCS#11。以下列表按照为实现预置、TLS 客户端身份验证和清除而调用的例程大致排序。有关各个函数的详细说明,请参阅标准委员会提供的 PKCS#11 文档。

常规设置和卸载 API

  • C_Initialize

  • C_Finalize

  • C_GetFunctionList

  • C_GetSlotList

  • C_GetTokenInfo

  • C_OpenSession

  • C_CloseSession

  • C_Login

预置 API

  • C_CreateObject CKO_PRIVATE_KEY(对于设备私有密钥)

  • C_CreateObject CKO_CERTIFICATE(对于设备证书和代码验证证书)

  • C_GenerateKeyPair

  • C_DestroyObject

客户端身份验证

  • C_GetAttributeValue

  • C_FindObjectsInit

  • C_FindObjects

  • C_FindObjectsFinal

  • C_GenerateRandom

  • C_SignInit

  • C_Sign

  • C_VerifyInit

  • C_Verify

  • C_DigestInit

  • C_DigestUpdate

  • C_DigestFinal

非对称加密支持

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。

创建基于 P-256 客户端证书的 AWS IoT 事物

  1. 创建 AWS IoT 事物。

    aws iot create-thing --thing-name thing-name
  2. 使用 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
  3. 创建证书注册请求,采用第 2 步中创建的密钥进行签名。

    openssl req -new -nodes -days 365 -key thing-name.key -out thing-name.req
  4. 向 AWS IoT 提交证书注册请求。

    aws iot create-certificate-from-csr \ --certificate-signing-request file://thing-name.req --set-as-active \ --certificate-pem-outfile thing-name.crt
  5. 将证书(由 ARN 输出通过上一个命令引用)附加到事物。

    aws iot attach-thing-principal --thing-name thing-name \ --principal "arn:aws-cn:iot:us-east-1:123456789012:cert/86e41339a6d1bbc67abf31faf455092cdebf8f21ffbc67c4d238d1326c7de729"
  6. 创建策略。(此策略过于宽松。只应当用作开发目的。)

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

    以下是在 create-policy 命令中指定的 policy.json 文件的列表。如果不希望运行 FreeRTOS 演示以进行 Greengrass 连接和发现,可以忽略 greengrass:* 操作。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:*", "Resource": "*" }, { "Effect": "Allow", "Action": "greengrass:*", "Resource": "*" } ] }
  7. 将委托人(证书)和策略附加到事物。

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

接下来,请按照本指南 AWS IoT 入门部分中的步骤进行操作。请记得将创建的证书和私有密钥复制到 aws_clientcredential_keys.h 文件中。将事物名称复制到 aws_clientcredential.h 中。

注意

仅出于演示目的对证书和私有密钥进行了硬编码。生产级应用程序应将这些文件存储在安全位置。

移植

有关将 PKCS #11 库移植到您的平台的信息,请参阅 FreeRTOS 移植指南中的移植 PKCS #11 库