使用 Amazon IoT Core 证书提供者进行自行管理的证书签名
您可以创建 Amazon IoT Core 证书提供者来签署 Amazon IoT 实例集预调配中的证书签名请求(CSR)。证书提供者引用 Lambda 函数以及适用于实例集预调配的 CreateCertificateFromCsr MQTT API。Lambda 函数接受 CSR 并返回签名的客户端证书。
如果您的 Amazon Web Services 账户没有证书提供者,系统会在实例集预调配中调用 CreateCertificateFromCsr MQTT API 以从 CSR 生成证书。创建证书提供者后,CreateCertificateFromCsr MQTT API 的行为将发生变化,对此 MQTT API 的所有调用都将调用证书提供者来颁发证书。
借助 Amazon IoT Core 证书提供者,您可以实施使用私有证书颁发机构(CA)[例如 Amazon 私有 CA、其他公开信任的 CA 或您自己的公钥基础设施(PKI)] 来签署 CSR 的解决方案。此外,您还可以使用证书提供者来自定义客户端证书的字段,例如有效期、签名算法、颁发者和扩展等。
重要
每个 Amazon Web Services 账户 只能创建一个证书提供者。签名行为更改会应用于调用 CreateCertificateFromCsr MQTT API 的整个实例集,直到您从 Amazon Web Services 账户中删除证书提供者。
本主题内容:
自行管理的证书签名在实例集预调配中的工作原理
重要概念
以下概念提供的详细信息有助于您了解自行管理证书的签名在 Amazon IoT 实例集预调配中的工作原理。有关更多信息,请参阅使用实例集预调配来预调配没有设备证书的设备。
- Amazon IoT 实例集预调配
-
通过使用 Amazon IoT 实例集预调配(简称实例集预调配),Amazon IoT Core 可以在设备首次连接到 Amazon IoT Core 时生成设备证书和私有密钥,并将它们安全地传递到设备。使用实例集预调配将没有设备证书的设备连接到 Amazon IoT Core。
- 证书签名请求(CSR)。
-
在实例集预调配过程中,设备通过实例集预调配 MQTT API 向 Amazon IoT Core 发出请求。该请求包括证书签名请求(CSR),该请求将会得到签名以创建客户端证书。
- 实例集预调配中的 Amazon 托管证书签名
-
Amazon 托管是实例集预调配中证书签名的默认设置。使用 Amazon 托管证书签名,Amazon IoT Core 将使用自己的 CA 签署 CSR。
- 实例集预调配中的自行管理的证书签名
-
自行管理是实例集预调配中的另一个证书签名选项。使用自行管理的证书签名,您可以创建 Amazon IoT Core 证书提供者来签署 CSR。您可以使用自行管理的证书签名,通过由 Amazon 私有 CA、其他公开信任的 CA 或您自己的公钥基础设施(PKI)生成的 CA 来签署 CSR。
- Amazon IoT Core 证书提供者
-
Amazon IoT Core 证书提供者(简称证书提供者)是一种客户管理的资源,用于实例集预调配中的自行管理的证书签名。
示意图
下图简要说明了自行管理的证书签名在 Amazon IoT 实例集预调配中的工作原理。
-
在生产新的物联网设备或将其引入实例集时,它需要有客户端证书来向 Amazon IoT Core 进行自我身份验证。
-
在实例集预调配过程中,设备通过实例集预调配 MQTT API,向 Amazon IoT Core 发出客户端证书请求。该请求包括证书签名请求(CSR)。
-
Amazon IoT Core 调用证书提供者并将 CSR 作为输入传递给提供者。
-
证书提供者将 CSR 作为输入并颁发客户端证书。
对于 Amazon 托管证书签名,Amazon IoT Core 将使用自己的 CA 对 CSR 进行签名并颁发客户端证书。
-
有了颁发的客户端证书,设备将继续进行实例集预调配,并与 Amazon IoT Core 建立安全连接。
证书提供程者 Lambda 函数输入
在 Amazon IoT Core 中注册设备时,它会将以下对象发送给 Lambda 函数。certificateSigningRequest 的值是 CreateCertificateFromCsr 请求中提供的隐私增强邮件(PEM)格式的 CSR。principalId 是发出 CreateCertificateFromCsr 请求时用于连接 Amazon IoT Core 的主体的 ID。clientId 是为 MQTT 连接设置的客户端 ID。
{ "certificateSigningRequest": "string", "principalId": "string", "clientId": "string" }
证书提供者 Lambda 函数返回值
Lambda 函数必须返回包含 certificatePem 值的响应。以下是成功响应的示例。Amazon IoT Core 将使用返回值 (certificatePem) 来创建证书。
{ "certificatePem": "string" }
如果注册成功,CreateCertificateFromCsr 将在 CreateCertificateFromCsr 响应中返回相同的 certificatePem。有关更多信息,请参阅 CreateCertificateFromCsr 的响应有效载荷示例。
示例 Lambda 函数
在创建证书提供者之前,您必须创建 Lambda 函数来签署 CSR。以下是 Python 中的 Lambda 函数示例。此函数使用私有 CA 和 SHA256WITHRSA 签名算法调用 Amazon 私有 CA 来对输入 CSR 进行签名。返回的客户证书的有效期为一年。有关 Amazon 私有 CA 以及如何创建私有 CA 的更多信息,请参阅什么是Amazon私有 CA?以及创建私有 CA。
注意
Amazon 私有证书颁发机构在中国区域中不可用。如果您想在中国使用自行管理的证书签名,请在以下代码示例中将私有 CA 替换为由其他公开信任的 CA 或您自己的公钥基础设施(PKI)生成的 CA。
import os import time import uuid import boto3 def lambda_handler(event, context): ca_arn = os.environ['CA_ARN'] csr = (event['certificateSigningRequest']).encode('utf-8') acmpca = boto3.client('acm-pca') cert_arn = acmpca.issue_certificate( CertificateAuthorityArn=ca_arn, Csr=csr, Validity={"Type": "DAYS", "Value": 365}, SigningAlgorithm='SHA256WITHRSA', IdempotencyToken=str(uuid.uuid4()) )['CertificateArn'] # Wait for certificate to be issued time.sleep(1) cert_pem = acmpca.get_certificate( CertificateAuthorityArn=ca_arn, CertificateArn=cert_arn )['Certificate'] return { 'certificatePem': cert_pem }
重要
以下基于资源的 Lambda 策略示例授予 Amazon IoT 调用 Lambda 函数的权限:
实例集预调配的自行管理的证书签名
您可以使用 Amazon CLI 或 Amazon Web Services 管理控制台 选择实例集预调配的自行管理的证书签名。
要选择自行管理的证书签名,您必须创建一个 Amazon IoT Core 证书提供者,以便在实例集预调配中签署 CSR。Amazon IoT Core 调用证书提供者,该提供者将 CSR 作为输入并返回客户端证书。要创建证书提供者,请使用 CreateCertificateProvider API 操作或 create-certificate-provider CLI 命令。
注意
创建证书提供者后,适用于实例集预调配的 CreateCertificateFromCsr API 的行为将发生变化,对 CreateCertificateFromCsr 的所有调用都将调用证书提供者来颁发证书。在创建证书提供程者后,此行为可能需要几分钟才会发生变化。
aws iot create-certificate-provider \ --certificateProviderNamemy-certificate-provider\ --lambdaFunctionArnarn:aws:lambda:us-east-1:123456789012:function:my-function-1\ --accountDefaultForOperations CreateCertificateFromCsr
以下内容显示了此命令的示例输出:
{ "certificateProviderName": "my-certificate-provider", "certificateProviderArn": "arn:aws:iot:us-east-1:123456789012:certificateprovider:my-certificate-provider" }
有关更多信息,请参阅《Amazon IoT API 参考》中的 CreateCertificateProvider。
要选择使用 Amazon Web Services 管理控制台 的自行管理的证书签名,请执行以下步骤:
-
转到 Amazon IoT 控制台
。 -
在左侧导航栏中的安全性下,选择证书签名。
-
在证书签名页面的证书签名详细信息下,选择编辑证书签名方法。
-
在编辑证书签名方法页面的证书签名方法下,选择自行管理。
-
在自行管理设置部分,输入证书提供者的名称,然后创建或选择 Lambda 函数。
-
选择更新证书签名。
证书提供者的 Amazon CLI 命令
创建证书提供者
要创建证书提供者,请使用 CreateCertificateProvider API 操作或 create-certificate-provider CLI 命令。
注意
创建证书提供者后,适用于实例集预调配的 CreateCertificateFromCsr API 的行为将发生变化,对 CreateCertificateFromCsr 的所有调用都将调用证书提供者来颁发证书。在创建证书提供程者后,此行为可能需要几分钟才会发生变化。
aws iot create-certificate-provider \ --certificateProviderNamemy-certificate-provider\ --lambdaFunctionArnarn:aws:lambda:us-east-1:123456789012:function:my-function-1\ --accountDefaultForOperations CreateCertificateFromCsr
以下内容显示了此命令的示例输出:
{ "certificateProviderName": "my-certificate-provider", "certificateProviderArn": "arn:aws:iot:us-east-1:123456789012:certificateprovider:my-certificate-provider" }
有关更多信息,请参阅《Amazon IoT API 参考》中的 CreateCertificateProvider。
更新证书提供者
要更新证书提供者,请使用 UpdateCertificateProvider API 操作或 update-certificate-provider CLI 命令。
aws iot update-certificate-provider \ --certificateProviderNamemy-certificate-provider\ --lambdaFunctionArnarn:aws:lambda:us-east-1:123456789012:function:my-function-2\ --accountDefaultForOperations CreateCertificateFromCsr
以下内容显示了此命令的示例输出:
{ "certificateProviderName": "my-certificate-provider", "certificateProviderArn": "arn:aws:iot:us-east-1:123456789012:certificateprovider:my-certificate-provider" }
有关更多信息,请参阅《Amazon IoT API 参考》中的 UpdateCertificateProvider。
描述证书提供者
要描述证书提供者,请使用 DescribeCertificateProvider API 操作或 describe-certificate-provider CLI 命令。
aws iot describe-certificate-provider --certificateProviderNamemy-certificate-provider
以下内容显示了此命令的示例输出:
{ "certificateProviderName": "my-certificate-provider", "lambdaFunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:my-function", "accountDefaultForOperations": [ "CreateCertificateFromCsr" ], "creationDate": "2022-11-03T00:15", "lastModifiedDate": "2022-11-18T00:15" }
有关更多信息,请参阅《Amazon IoT API 参考》中的 DescribeCertificateProvider。
删除证书提供者
要删除证书提供者,请使用 DeleteCertificateProvider API 操作或 delete-certificate-provider CLI 命令。如果您删除证书提供者资源,CreateCertificateFromCsr 的行为将恢复,Amazon IoT 将创建由 Amazon IoT 从 CSR 签名的证书。
aws iot delete-certificate-provider --certificateProviderNamemy-certificate-provider
此命令不会生成任何输出。
有关更多信息,请参阅《Amazon IoT API 参考》中的 DeleteCertificateProvider。
列出证书提供者
要列出 Amazon Web Services 账户 中的证书提供者,请使用 ListCertificateProviders API 操作或 list-certificate-providers CLI 命令。
aws iot list-certificate-providers
以下内容显示了此命令的示例输出:
{ "certificateProviders": [ { "certificateProviderName": "my-certificate-provider", "certificateProviderArn": "arn:aws:iot:us-east-1:123456789012:certificateprovider:my-certificate-provider" } ] }
有关更多信息,请参阅《Amazon IoT API 参考》中的 ListCertificateProvider。