使用证书提供程序进行自我管理的 AWS IoT Core 证书签名 - AWS IoT Core

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

使用证书提供程序进行自我管理的 AWS IoT Core 证书签名

您可以创建 AWS IoT Core 证书提供商来签署 AWS IoT 队列配置中的证书签名请求 (CSR)。证书提供商引用 Lambda 函数和 CreateCertificateFromCsrMQTT API 进行队列配置。Lambda 函数接受 CSR 并返回签名的客户端证书。

当您的证书提供商没有证书提供商时 AWS 账户,系统会在队列配置中调用 CreateCertificateFromCsr MQTT API 来从 CSR 生成证书。创建证书提供商后,CreateCertificateFromCsr MQTT API 的行为将发生变化,对此 MQTT API 的所有调用都将调用证书提供商来颁发证书。

借助 AWS IoT Core 证书提供商,您可以实施利用私有证书颁发机构 (CA)(例如AWS Private CA其他公开信任的 CA)或您自己的公钥基础架构 (PKI) 来签署 CSR 的解决方案。此外,您还可以使用证书提供商自定义客户端证书的字段,例如有效期、签名算法、颁发者和扩展名。

重要

每个证书提供商只能创建一个证书提供商 AWS 账户。签名行为更改适用于调用 CreateCertificateFromCsr MQTT API 的整个队列,直到您 AWS 账户从中删除证书提供商。

自行管理的证书签名在队列配置中的工作原理

重要概念

以下概念提供的详细信息可以帮助您了解自管理证书签名在 AWS IoT 队列配置中的工作原理。有关更多信息,请参阅使用队列配置配置没有设备证书的设备。

AWS IoT 舰队配置

使用 AWS IoT 队列配置(队列配置的缩写),可在设备首次连接时 AWS IoT Core 生成设备证书并将其安全地交付 AWS IoT Core 给您的设备。您可以使用队列配置将没有设备证书的设备连接到 AWS IoT Core。

证书签名请求 (CSR)

在队列配置过程中,设备 AWS IoT Core 通过队列配置 MQTT API 向发出请求。此请求包括证书签名请求 (CSR),该请求将被签名以创建客户端证书。

AWS 队列配置中的托管证书签名

AWS managed 是队列配置中证书签名的默认设置。使用 AWS 托管证书签名, AWS IoT Core 将使用自己的 CA 签署 CSR。

队列配置中的自管理证书签名

自行管理是队列配置中证书签名的另一种选择。使用自我管理的证书签名,您可以创建 AWS IoT Core 证书提供商来签署 CSR。您可以使用自我管理的证书签名与 AWS 私有 CA、其他公开信任的 CA 或您自己的公钥基础架构 (PKI) 生成的 CA 签署 CSR。

AWS IoT Core 证书提供商

AWS IoT Core 证书提供商(证书提供者的缩写)是一种客户管理的资源,用于队列配置中的自我管理证书签名。

图表

下图简要说明了自证书签名在 AWS IoT 队列配置中的工作原理。

AWS IoT Core 用于队列配置的证书提供商
  • 在制造新的物联网设备或将其引入设备队列时,它需要使用客户端证书进行身份验证 AWS IoT Core。

  • 作为队列配置过程的一部分,设备通过队列配置 MQTT API 向 AWS IoT Core 请求客户端证书。此请求包括证书签名请求 (CSR)。

  • AWS IoT Core 调用证书提供者并将 CSR 作为输入传递给提供者。

  • 证书提供者将 CSR 作为输入并颁发客户端证书。

    对于 AWS 托管证书签名, AWS IoT Core 使用自己的 CA 对 CSR 进行签名并颁发客户端证书。

  • 有了已颁发的客户端证书,设备将继续进行队列配置并与建立安全连接 AWS IoT Core。

证书提供商 Lambda 函数输入

AWS IoT Core 当设备向 Lambda 函数注册时,会将以下对象发送到 Lambda 函数。的值certificateSigningRequest是请求中提供的隐私增强邮件 (PEM) 格式的 CSR。CreateCertificateFromCsrprincipalId是发出CreateCertificateFromCsr请求 AWS IoT Core 时用于连接的主体的 ID。 clientId是为 MQTT 连接设置的客户端 ID。

{ "certificateSigningRequest": "string", "principalId": "string", "clientId": "string" }

证书提供商 Lambda 函数返回值

Lambda 函数必须返回包含该certificatePem值的响应。以下是成功响应的示例。 AWS IoT Core 将使用返回值 (certificatePem) 来创建证书。

{ "certificatePem": "string" }

如果注册成功,CreateCertificateFromCsr将在CreateCertificateFromCsr响应certificatePem中返回相同的结果。有关更多信息,请参阅的响应负载示例CreateCertificateFromCsr

示例 Lambda 函数

在创建证书提供商之前,您必须创建一个 Lambda 函数来签署 CSR。以下是 Python 中的 Lambda 函数示例。此函数使用私有 CA 和签名算法调 AWS Private CA 用对输入 CSR 进行SHA256WITHRSA签名。返回的客户证书有效期为一年。有关私有 CA AWS Private CA 以及如何创建私有 CA 的更多信息,请参阅什么是 AWS 私有 CA? 以及创建私有 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 函数返回的证书必须具有与证书签名请求 (CSR) 相同的主题名称和公钥。

  • Lambda 函数必须在 5 秒钟内完成运行。

  • Lambda 函数必须与证书提供商 AWS 账户 资源位于同一区域中。

  • 必须向 AWS IoT 服务委托人授予 Lambda 函数的调用权限。为避免混淆代理问题,我们建议您sourceAccount为调用权限设置sourceArn和。有关更多信息,请参阅防止跨服务混淆代理

以下基于资源的 Lambd a 策略示例 AWS IoT 授予了调用 Lambda 函数的权限:

{ "Version": "2012-10-17", "Id": "InvokePermission", "Statement": [ { "Sid": "LambdaAllowIotProvider", "Effect": "Allow", "Principal": { "Service": "iot.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:my-function", "Condition": { "StringEquals": { "AWS:SourceAccount": "123456789012" }, "ArnLike": { "AWS:SourceArn": "arn:aws:iot:us-east-1:123456789012:certificateprovider:my-certificate-provider" } } } ] }

用于队列配置的自管理证书签名

您可以使用 AWS CLI 或 AWS Management Console选择自行管理的证书签名进行队列置备。

要选择自我管理的证书签名,您必须创建一个 AWS IoT Core 证书提供商,以便在队列配置中对 CSR 进行签名。 AWS IoT Core 调用证书提供程序,该提供程序将 CSR 作为输入并返回客户端证书。要创建证书提供者,请使用 CreateCertificateProvider API 操作或 create-certificate-provider CLI 命令。

注意

创建证书提供商后,用于队列预配 CreateCertificateFromCsr API 的行为将发生变化,因此对的所有调用都CreateCertificateFromCsr将调用证书提供商来创建证书。创建证书提供商后,这种行为可能需要几分钟才能改变。

aws iot create-certificate-provider \ --certificateProviderName my-certificate-provider \ --lambdaFunctionArn arn: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" }

有关更多信息,请参阅 CreateCertificateProvider AWS IoTAPI 参考中的

要选择使用自行管理的证书签名 AWS Management Console,请执行以下步骤:

  1. 转到 AWS IoT 控制台

  2. 在左侧导航栏的 “安全” 下,选择 “证书签名”。

  3. 证书签名页面的证书签名详细信息下,选择编辑证书签名方法

  4. 编辑证书签名方法页面的证书签名方法下,选择自我管理

  5. 自管理设置部分,输入证书提供商的名称,然后创建或选择 Lambda 函数。

  6. 选择更新证书签名

AWS CLI 证书提供商的命令

创建证书提供商

要创建证书提供者,请使用 CreateCertificateProvider API 操作或 create-certificate-provider CLI 命令。

注意

创建证书提供商后,用于队列预配 CreateCertificateFromCsr API 的行为将发生变化,因此对的所有调用都CreateCertificateFromCsr将调用证书提供商来创建证书。创建证书提供商后,这种行为可能需要几分钟才能改变。

aws iot create-certificate-provider \ --certificateProviderName my-certificate-provider \ --lambdaFunctionArn arn: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" }

有关更多信息,请参阅 CreateCertificateProvider AWS IoTAPI 参考中的

更新证书提供商

要更新证书提供者,请使用 UpdateCertificateProvider API 操作或 update-certificate-provider CLI 命令。

aws iot update-certificate-provider \ --certificateProviderName my-certificate-provider \ --lambdaFunctionArn arn: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" }

有关更多信息,请参阅 UpdateCertificateProvider AWS IoTAPI 参考中的

描述证书提供商

要描述证书提供者,请使用 DescribeCertificateProvider API 操作或 describe-certificate-provider CLI 命令。

aws iot describe-certificate-provider --certificateProviderName my-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" }

有关更多信息,请参阅 DescribeCertificateProvider AWS IoTAPI 参考中的

删除证书提供商

要删除证书提供商,请使用 DeleteCertificateProvider API 操作或 delete-certificate-provider CLI 命令。如果您删除证书提供商资源,则的行为CreateCertificateFromCsr将恢复, AWS IoT 并将创建 AWS IoT 由 CSR 签名的证书。

aws iot delete-certificate-provider --certificateProviderName my-certificate-provider

此命令不会生成任何输出。

有关更多信息,请参阅 DeleteCertificateProvider AWS IoTAPI 参考中的

列出证书提供商

要列出您的证书提供商 AWS 账户,请使用 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" } ] }

有关更多信息,请参阅 ListCertificateProviderAWS IoTAPI 参考中的