用于 OCSP 绑定的服务器证书配置 - Amazon IoT Core
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

用于 OCSP 绑定的服务器证书配置

Amazon IoT Core 支持服务器证书的联机证书状态协议 (OCSP) 装订,也称为服务器证书 OCSP 装订或 OCSP 装订。它是一种安全机制,用于在传输层安全性协议(TLS)握手中检查服务器证书的吊销状态。OCSP 装订 Amazon IoT Core 允许您为自定义域的服务器证书有效性添加额外的验证层。

您可以通过定期查询 OCSP 响应器 Amazon IoT Core 来启用服务器证书 OCSP 装订以检查证书的有效性。OCSP 绑定设置是使用自定义域创建或更新域配置的过程中的一环。OCSP 绑定会持续检查服务器证书的吊销状态。这有助于验证已被 CA 吊销的所有证书是否不再受连接到您自定义域的客户端的信任。有关更多信息,请参阅 在中启用服务器证书 OCSP Amazon IoT Core

服务器证书 OCSP 装绑定提供实时吊销状态检查,可减少与检查吊销状态相关的延迟,并改善安全连接的隐私性和可靠性。有关使用 OCSP 绑定的好处的更多信息,请参阅与客户端 OCSP 检查相比使用 OCSP 绑定的好处

注意

此功能在中不可用 Amazon GovCloud (US) Regions。

什么是 OCSP?

在线证书状态协议(OCSP)有助于为传输层安全性协议(TLS)握手提供服务器证书的吊销状态。

重要概念

以下关键概念提供了有关在线证书状态协议(OCSP)的详细信息。

OCSP

OCSP 用于在传输层安全性协议(TLS)握手期间检查证书吊销状态。OCSP 支持对证书进行实时验证。这可以确认证书自颁发以来没有吊销或过期。与传统的证书吊销列表 () CRLs 相比,OCSP 的扩展性也更强。OCSP 响应较小,可以高效生成,因此更适合大型私钥基础架构 (PKIs)。

OCSP 响应程序

OCSP 响应程序(也称为 OCSP 服务器)接收并响应来自想要验证证书吊销状态的客户端的 OCSP 请求。

客户端 OCSP

在客户端 OCSP 中,客户端使用 OCSP 与 OCSP 响应者联系,以在 TLS 握手期间检查证书的吊销状态。

服务器端 OCSP

在服务器端 OCSP(也称为 OCSP 绑定)中,服务器(而不是客户端)可以向 OCSP 响应程序发出请求。服务器将 OCSP 响应绑定到证书,然后在 TLS 握手期间将其返回给客户端。

OCSP 示意图

下图说明了客户端 OCSP 和服务器端 OCSP 的工作原理。

客户端 OCSP 和服务器端 OCSP 示意图
客户端 OCSP
  1. 客户端发送一条 ClientHello 消息,来启动与服务器的 TLS 握手。

  2. 服务器收到消息并用 ServerHello 消息进行响应。服务器还将服务器证书发送给客户端。

  3. 客户端验证服务器证书并从中提取 OCSP URI。

  4. 客户端向 OCSP 响应程序发送证书吊销检查请求。

  5. OCSP 响应程序发送 OCSP 响应。

  6. 客户端验证来自 OCSP 响应的证书状态。

  7. TLS 握手完成。

服务器端 OCSP
  1. 客户端发送一条 ClientHello 消息,来启动与服务器的 TLS 握手。

  2. 服务器收到消息并获取最新缓存的 OCSP 响应。如果缓存的响应丢失或已过期,服务器将调用 OCSP 响应程序来获取证书状态。

  3. OCSP 响应程序向服务器发送 OCSP 响应。

  4. 服务器发送一条 ServerHello 消息。服务器还将服务器证书和证书状态发送给客户端。

  5. 客户端验证 OCSP 证书状态。

  6. TLS 握手完成。

OCSP 绑定的工作原理

在客户端和服务器之间的 TLS 握手期间,使用 OCSP 装订来检查服务器证书吊销状态。服务器向 OCSP 响应程序发出 OCSP 请求,并将 OCSP 响应绑定到返回给客户端的证书。通过让服务器向 OCSP 响应程序发出请求,可以缓存响应,然后多次用于许多客户端。

OCSP 装订的工作原理 Amazon IoT Core

下图显示了 Amazon IoT Core中服务器端 OCSP 绑定的工作原理。

此图显示了服务器端 OCSP 装订的工作原理。 Amazon IoT Core
  1. 设备需要在启用 OCSP 绑定的自定义域中注册。

  2. Amazon IoT Core 每小时呼叫 OCSP 响应者以获取证书状态。

  3. OCSP 响应程序接收请求,发送最新的 OCSP 响应,并存储缓存的 OCSP 响应。

  4. 设备发送一条ClientHello消息以启动 TLS 握手 Amazon IoT Core。

  5. Amazon IoT Core 从服务器缓存中获取最新的 OCSP 响应,服务器缓存以证书的 OCSP 响应进行响应。

  6. 服务器向设备发送 ServerHello 消息。服务器还将服务器证书和证书状态发送给客户端。

  7. 设备验证 OCSP 证书状态。

  8. TLS 握手完成。

与客户端 OCSP 检查相比使用 OCSP 绑定的好处

使用服务器证书 OCSP 装订的一些优点包括:

改善了隐私性

如果没有 OCSP 绑定,客户端的设备可能会将信息暴露给第三方 OCSP 响应程序,从而可能危及用户隐私。OCSP 绑定通过让服务器获取 OCSP 响应并将其直接传送给客户端,从而缓解了此问题。

提高了可靠性

OCSP 绑定可以提高安全连接的可靠性,因为它可以降低 OCSP 服务器中断的风险。对 OCSP 响应进行绑定时,服务器会将最新的响应包含在证书内。这样,即使 OCSP 响应程序暂时不可用,客户端也可以获取吊销状态。OCSP 装订有助于缓解这些问题,因为服务器会定期获取 OCSP 响应并将缓存的响应包含在 TLS 握手中。这减少了对 OCSP 响应者实时可用性的依赖。

减少服务器负载

OCSP 绑定将响应 OCSP 响应程序的 OCSP 请求的负担转移到服务器。此举有助于更均匀地分配负载,从而提高证书验证过程的效率和可扩展性。

减少延迟

OCSP 绑定减少了 TLS 握手期间与检查证书吊销状态相关的延迟。客户端不必单独查询 OCSP 服务器,而是在握手期间发送请求并附上 OCSP 响应和服务器证书。

在中启用服务器证书 OCSP Amazon IoT Core

要启用服务器证书 OCSP 装订 Amazon IoT Core,请为自定义域创建域配置或更新现有的自定义域配置。有关为自定义域创建域配置的一般信息,请参阅创建和配置客户托管域

按照以下说明使用或 Amazon Web Services Management Console 启用 OCSP 服务器装订。 Amazon CLI

要使用控制台启用服务器证书 OCSP 装订,请执行 Amazon IoT 以下操作:
  1. 在导航菜单中,选择设置,然后选择创建域配置,或者为自定义域选择现有的域配置。

  2. 如果您在上一步中选择创建新的域配置,您将看到创建域配置页面。在域配置属性部分中,选择自定义域。输入创建域配置的信息。

    如果您选择更新自定义域的现有域配置,您将看到域配置详细信息页面。选择编辑

  3. 要启用 OCSP 服务器绑定,请在服务器证书配置小节中选择启用服务器证书 OCSP 绑定

  4. 选择创建域配置更新域配置

要使用 Amazon CLI启用服务器证书 OCSP 绑定,请执行以下操作:
  1. 如果您为自定义域创建新的域配置,则启用 OCSP 服务器绑定的命令可能如下所示:

    aws iot create-domain-configuration --domain-configuration-name "myDomainConfigurationName" \ --server-certificate-arns arn:aws:iot:us-east-1:123456789012:cert/f8c1e5480266caef0fdb1bf97dc1c82d7ba2d3e2642c5f25f5ba364fc6b79ba3 \ --server-certificate-config "enableOCSPCheck=true|false"
  2. 如果您要更新自定义域的现有域配置,则启用 OCSP 服务器绑定的命令可能如下所示:

    aws iot update-domain-configuration --domain-configuration-name "myDomainConfigurationName" \ --server-certificate-arns arn:aws:iot:us-east-1:123456789012:cert/f8c1e5480266caef0fdb1bf97dc1c82d7ba2d3e2642c5f25f5ba364fc6b79ba3 \ --server-certificate-config "enableOCSPCheck=true|false"

有关更多信息,请参阅 Amazon IoT API 参考UpdateDomainConfiguration中的CreateDomainConfiguration和。

在中为私有终端节点配置服务器证书 OCSP Amazon IoT Core

私有终端节点的 OCSP 允许您使用亚马逊虚拟私有云(亚马逊 VPC)中的私有 OCSP 资源进行 Amazon IoT Core 操作。该过程包括设置一个充当 OCSP 响应器的 Lambda 函数。Lambda 函数可能会使用您的私有 OCSP 资源来制作将要使用的 OCSP 响应。 Amazon IoT Core

Lambda 函数

在为私有终端节点配置服务器 OCSP 之前,请创建一个 Lambda 函数,该函数充当符合评论请求 (RFC) 6960 的在线证书状态协议 (OCSP) 响应器,支持基本 OCSP 响应。Lambda 函数接受区分编码规则 (DER) 格式的 OCSP 请求的 base64 编码。Lambda 函数的响应也是 DER 格式的 base64 编码的 OCSP 响应。响应大小不得超过 4 千字节 (KiB)。Lambda 函数必须与域 Amazon Web Services 区域 配置相同 Amazon Web Services 账户 。以下是 Lambda 函数的示例。

Lambda 函数示例

JavaScript
import * as pkijs from 'pkijs'; console.log('Loading function'); export const handler = async (event, context) => { const requestBytes = decodeBase64(event); const ocspRequest = pkijs.OCSPRequest.fromBER(requestBytes); console.log("Here is a better look at the OCSP request"); console.log(ocspRequest.toJSON()); const ocspResponse = getOcspResponse(); console.log("Here is a better look at the OCSP response"); console.log(ocspResponse.toJSON()); const responseBytes = ocspResponse.toSchema().toBER(); return encodeBase64(responseBytes); }; function getOcspResponse() { const responseString = "MIIC/woBAKCCAvgwggL0BgkrBgEFBQcwAQEEggLlMIIC4TCByqFkMGIxJzAlBgNVBAoMHlJpY2hhcmQncyBEaXNjb3VudCBMYW1iZGEgT0NTUDEZMBcGA1UEAwwQcm91bmRhYm91dE5hdGlvbjEPMA0GA1UEBwwGQ2FybWVsMQswCQYDVQQGEwJJThgPMjAyNDA0MjMxODUzMjVaMFEwTzA6MAkGBSsOAwIaBQAEFD2L7Ol/6ieNMaJbwRbxFWFweXGPBBSzSThwzTc3/p5w7WOtPjp3otNtVgIBAYAAGA8yMDI0MDQyMzE4NTMyNVowDQYJKoZIhvcNAQELBQADggIBAJFRyjDAHfazNejo704Ra3FOsGq/+s82R1spDarr3k7Pzkod9jJhwsZ2YgushlS4Npfe4lHCdwFyZR75WXrW55aXFddy03KLz01ZLNYyxkleW3f5dgrUcRU3PMW9TU2gZ0VOV8L5pmxKBoBRFt6EKtyh4CbiuqkTpLdLIMZmTyanhl5GVyU5MBHdbH8YWZoT/DEBiyS7ZsyhKo6igWU/SY7YMSKgwBvFsqSDcOa/hRYQkxWKWJ19gcz8CIkWN7NvfIxCs6VrAdzEJwmE7y3v+jdfhxW9JmI4xStE4K0tAR9vVOOfKs7NvxXj7oc9pCSG60xl96kaEE6PaY1YsfNTsKQ7pyCJ0s7/2q+ieZ4AtNyzw1XBadPzPJNv6E0LvI24yQZqN5wACvtut5prMMRxAHbOy+abLZR58wloFSELtGJ7UD96LFv1GgtC5s+2QlzPc4bEEof7Lo1EISt3j2ibNch8LxhqTQ4ufrbhsMkpSOTFYEJVMJF6aKj/OGXBUUqgc0Jx6jjJXNQd+l5KCY9pQFeb/wVUYC6mYqZOkNNMMJxPbHHbFnqb68yO+g5BE9011N44YXoPVJYoXxBLFX+OpRu9cqPkT9/vlkKd+SYXQknwZ81agKzhf1HsBKabtJwNVMlBKaI8g5UGa7Bxi6ewH3ezdWiERRUK7F56OM53wto/"; const responseBytes = decodeBase64(responseString); return pkijs.OCSPResponse.fromBER(responseBytes); } function decodeBase64(input) { const binaryString = atob(input); const byteArray = new Uint8Array(binaryString.length); for (var i = 0; i < binaryString.length; i++) { byteArray[i] = binaryString.charCodeAt(i); } return byteArray.buffer; } function encodeBase64(buffer) { var binary = ''; const bytes = new Uint8Array( buffer ); const len = bytes.byteLength; for (var i = 0; i < len; i++) { binary += String.fromCharCode( bytes[ i ] ); } return btoa(binary); }
Java
package com.example.ocsp.responder; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.LambdaLogger; import com.amazonaws.services.lambda.runtime.RequestHandler; import org.bouncycastle.cert.ocsp.OCSPReq; import org.bouncycastle.cert.ocsp.OCSPResp; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Base64; public class LambdaResponderApplication implements RequestHandler<String, String> { @Override public String handleRequest(final String input, final Context context) { LambdaLogger logger = context.getLogger(); byte[] decodedInput = Base64.getDecoder().decode(input); OCSPReq req; try { req = new OCSPReq(decodedInput); } catch (IOException e) { logger.log("Got an IOException creating the OCSP request: " + e.getMessage()); throw new RuntimeException(e); } try { OCSPResp response = businessLogic.getMyResponse(); String toReturn = Base64.getEncoder().encodeToString(response.getEncoded()); return toReturn; } catch (Exception e) { logger.log("Got an exception creating the response: " + e.getMessage()); return ""; } } }

授权调用您 Amazon IoT 的 Lambda 函数

在使用 Lambda OCSP 响应器创建域配置的过程中,您必须授予在函数创建后调用 Lambda 函数的 Amazon IoT 权限。要授予权限,您可以使用 add-permission CLI 命令。

使用授予您的 Lambda 函数的权限 Amazon CLI
  1. 插入您的值后,输入以下命令。请注意,statement-id 值必须唯一。将 Id-1234 替换为您的确切值,否则,可能会出现 ResourceConflictException 错误。

    aws lambda add-permission \ --function-name "ocsp-function" \ --principal "iot.amazonaws.com" \ --action "lambda:InvokeFunction" \ --statement-id "Id-1234" \ --source-arn arn:aws:iot:us-east-1:123456789012:domainconfiguration/<domain-config-name>/* --source-account 123456789012

    物联网域配置 ARNs 将遵循以下模式。服务生成的后缀在创建之前是未知的,因此必须将后缀替换为。*一旦创建了域配置并且知道了确切的 ARN,您就可以更新权限。

    arn:aws:iot:use-east-1:123456789012:domainconfiguration/domain-config-name/service-generated-suffix

  2. 如果命令成功,则返回一个权限语句,如本示例。您可以继续下一节,为私有终端节点配置 OCSP 装订。

    { "Statement": "{\"Sid\":\"Id-1234\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"iot.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:us-east-1:123456789012:function:ocsp-function\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:iot:us-east-1:123456789012:domainconfiguration/domain-config-name/*\"}}}" }

    如果命令不成功,则返回错误,如本示例。在继续操作之前,您需要查看并更正错误。

    An error occurred (AccessDeniedException) when calling the AddPermission operation: User: arn:aws:iam::57EXAMPLE833:user/EXAMPLE-1 is not authorized to perform: lambda:AddPer mission on resource: arn:aws:lambda:us-east-1:123456789012:function:ocsp-function

为私有端点配置服务器 OCSP 装订

要使用控制台配置服务器证书 OCSP 装订,请执行 Amazon IoT 以下操作:
  1. 从导航菜单中选择 “设置”,然后选择 “创建域配置”,或者为自定义域选择现有的域配置。

  2. 如果您在上一步中选择创建新的域配置,您将看到创建域配置页面。在域配置属性部分中,选择自定义域。输入创建域配置的信息。

    如果您选择更新自定义域的现有域配置,您将看到域配置详细信息页面。选择编辑

  3. 要启用 OCSP 服务器绑定,请在服务器证书配置小节中选择启用服务器证书 OCSP 绑定

  4. 选择创建域配置更新域配置

要使用以下方法配置服务器证书 OCSP 装订,请执行以下操作: Amazon CLI
  1. 如果您为自定义域创建新的域配置,则为私有终端节点配置服务器证书 OCSP 的命令可能如下所示:

    aws iot create-domain-configuration --domain-configuration-name "myDomainConfigurationName" \ --server-certificate-arns arn:aws:iot:us-east-1:123456789012:cert/f8c1e5480266caef0fdb1bf97dc1c82d7ba2d3e2642c5f25f5ba364fc6b79ba3 \ --server-certificate-config "enableOCSPCheck=true, ocspAuthorizedResponderArn=arn:aws:acm:us-east-1:123456789012:certificate/certificate_ID, ocspLambdaArn=arn:aws:lambda:us-east-1:123456789012:function:my-function"
  2. 如果您更新自定义域的现有域配置,则为私有终端节点配置服务器证书 OCSP 的命令可能如下所示:

    aws iot update-domain-configuration --domain-configuration-name "myDomainConfigurationName" \ --server-certificate-arns arn:aws:iot:us-east-1:123456789012:cert/f8c1e5480266caef0fdb1bf97dc1c82d7ba2d3e2642c5f25f5ba364fc6b79ba3 \ --server-certificate-config "enableOCSPCheck=true, ocspAuthorizedResponderArn=arn:aws:acm:us-east-1:123456789012:certificate/certificate_ID, ocspLambdaArn=arn:aws:lambda:us-east-1:123456789012:function:my-function"
enableOCSPCheck

这是一个布尔值,用于指示是否启用服务器 OCSP 装订检查。要启用服务器证书 OCSP 装订,此值必须为 true。

ocspAuthorizedResponderArn

这是存储在 (ACM) 中的 X.509 证书的亚马逊资源名称 (ARN) 的字符串值。 Amazon Certificate Manager 如果提供, Amazon IoT Core 将使用此证书来验证收到的 OCSP 响应的签名。如果未提供, Amazon IoT Core 将使用签发证书来验证回复。证书必须与域配置相同 Amazon Web Services 账户 。 Amazon Web Services 区域 有关如何注册授权响应者证书的更多信息,请参阅将 Amazon Certificate Manager证书导入

ocspLambdaArn

这是 Lambda 函数的亚马逊资源名称 (ARN) 的字符串值,该函数充当符合征求意见 (RFC) 6960 (OCSP) 的响应器,支持基本 OCSP 响应。Lambda 函数接受使用 DER 格式编码的 OCSP 请求的 base64 编码。Lambda 函数的响应也是 DER 格式的 base64 编码的 OCSP 响应。响应大小不得超过 4 千字节 (KiB)。Lambda 函数必须与域 Amazon Web Services 区域 配置相同 Amazon Web Services 账户 。

有关更多信息,请参阅 Amazon IoT API 参考UpdateDomainConfiguration中的CreateDomainConfiguration和。

在中使用服务器证书 OCSP 装订的重要注意事项 Amazon IoT Core

在中使用服务器证书 OCSP 时 Amazon IoT Core,请记住以下几点:

  1. Amazon IoT Core 仅支持那些可通过公共 IPv4 地址访问的 OCSP 响应器。

  2. 中的 OCSP 装订功能 Amazon IoT Core 不支持授权响应者。所有 OCSP 响应都必须由签署证书的 CA 签名,并且 CA 必须是自定义域证书链的一部分。

  3. 中的 OCSP 装订功能 Amazon IoT Core 不支持使用自签名证书创建的自定义域。

  4. Amazon IoT Core 每小时呼叫 OCSP 响应者并缓存响应。如果对应答者的呼叫失败, Amazon IoT Core 将装订最新的有效回复。

  5. 如果不再有效,nextUpdateTime则 Amazon IoT Core 将从缓存中删除响应,并且在下次成功调用 OCSP 响应器之前,TLS 握手将不包含 OCSP 响应数据。当缓存的响应在服务器从 OCSP 响应程序获得有效响应之前已过期时,就会发生这种情况。值 nextUpdateTime 表明 OCSP 响应在此时间之前将一直有效。有关 nextUpdateTime的更多信息,请参阅服务器证书 OCSP 日志条目

  6. 有时, Amazon IoT Core 无法收到 OCSP 响应或删除现有的 OCSP 响应,因为该响应已过期。如果发生此类情况, Amazon IoT Core 将继续使用自定义域提供的服务器证书,而不会获得 OCSP 响应。

  7. OCSP 响应的大小不能超过 4 KiB。

对服务器证书 OCSP 装订进行故障排除 Amazon IoT Core

Amazon IoT Core 将RetrieveOCSPStapleData.Success指标和RetrieveOCSPStapleData日志条目发送到。 CloudWatch指标和日志条目有助于检测与检索 OCSP 响应有关的问题。有关更多信息,请参阅服务器证书 OCSP 绑定指标服务器证书 OCSP 日志条目