关联 CloudFront 连接函数
利用 CloudFront 连接函数,您可以在 TLS 握手过程中实施自定义证书验证逻辑,从而扩展内置 mTLS 身份验证功能。
什么是连接函数?
连接函数是指在客户端证书验证完成后,在 TLS 握手过程中运行的 JavaScript 函数。经过验证的客户端证书将传递给连接函数,此时连接函数可进一步决定是否授予访问权限。有关连接函数的详细信息,请参阅使用 CloudFront Functions 在边缘进行自定义。
连接函数与 mTLS 的协作方式
当客户端尝试与 CloudFront 分配建立 mTLS 连接时,将遵循以下流程:
-
客户端向 CloudFront 边缘站点发起 TLS 握手请求。
-
CloudFront 请求并接收客户端证书。
-
CloudFront 对信任存储执行标准证书验证。
-
如果证书通过标准验证,CloudFront 将调用您的连接函数。如果在 ViewerMtlsConfig 中启用了 IgnoreCertificateExpiry,则虽已到期但其他条件均有效的证书也将传递至连接函数。如果客户端证书无效,则不会调用连接函数。
-
您的连接函数接收经过解析的证书信息和连接详细信息。
-
函数根据自定义逻辑做出允许/拒绝决定。
-
CloudFront 根据您的决定完成或终止 TLS 连接。
在验证模式和可选模式(当客户端提供证书时)下,都将调用连接函数。
请求增加连接函数配额
请求为 AWS 账户增加连接函数配额。
请求增加连接函数配额
登录 AWS 管理控制台,并通过以下网址打开 CloudFront 控制台:https://console.aws.amazon.com/cloudfront/v4/home
。 -
在导航窗格中,选择 Functions(函数)。
-
选择连接函数选项卡。
-
对于请求,请选择链接以联系 CloudFront 支持工程部门。
-
CloudFront 支持工程部门会检查您的请求。检查过程最多可能需要两天。
在请求获得批准后,您可以在账户中创建连接函数,并在使用双向 TLS 时将此函数与一个或多个分配相关联。
创建连接函数
您可以使用 CloudFront 控制台或 AWS CLI 创建连接函数。
创建连接函数(控制台)
登录 AWS 管理控制台,并通过以下网址打开 CloudFront 控制台:https://console.aws.amazon.com/cloudfront/v4/home
。 -
在导航窗格中,选择 Functions(函数)。
-
选择连接函数选项卡,然后选择创建连接函数。
-
输入在 AWS 账户中唯一的函数名称。
-
选择继续。
-
在函数编辑器中,编写用于证书验证的 JavaScript 代码。函数处理程序必须调用 allow 或 deny。
-
可选:可将 KeyValueStore 与连接函数关联以实施吊销控制。
-
选择保存更改。
创建连接函数(AWS CLI)
以下示例演示如何创建连接函数:
在单独的文件(例如 code.js)中编写函数代码:
function connectionHandler(connection) { connection.allow(); }
aws cloudfront create-connection-function \ --name "certificate-validator" \ --connection-function-config '{ "Comment": "Client certificate validation function", "Runtime": "cloudfront-js-2.0" }' \ --connection-function-code fileb://code.js
连接函数代码结构
连接函数会实施 connectionHandler 函数,该函数接收一个包含证书和连接信息的连接对象。您的函数必须使用 connection.allow() 或 connection.deny() 来决定是否允许该连接。
基本连接函数示例
以下示例展示了一个简单的连接函数,该函数用于验证客户端证书的主题字段:
function connectionHandler(connection) { // Only process if a certificate was presented if (!connection.clientCertificate) { console.log("No certificate presented"); connection.deny(); } // Check the subject field for specific organization const subject = connection.clientCertificate.certificates.leaf.subject; if (!subject.includes("O=ExampleCorp")) { console.log("Certificate not from authorized organization"); connection.deny(); } else { // All checks passed console.log("Certificate validation passed"); connection.allow(); } }
此处提供了连接对象上可用的客户端证书属性的完整规范:
{ "connectionId": "Fdb-Eb7L9gVn2cFakz7wWyBJIDAD4-oNO6g8r3vXDV132BtnIVtqDA==", // Unique identifier for this TLS connection "clientIp": "203.0.113.42", // IP address of the connecting client (IPv4 or IPv6) "clientCertificate": { "certificates": { "leaf": { "subject": "CN=client.example.com,O=Example Corp,C=US", // Distinguished Name (DN) of the certificate holder "issuer": "CN=Example Corp Intermediate CA,O=Example Corp,C=US", // Distinguished Name (DN) of the certificate authority that issued this certificate "serialNumber": "4a:3f:5c:92:d1:e8:7b:6c", // Unique serial number assigned by the issuing CA (hexadecimal) "validity": { "notBefore": "2024-01-15T00:00:00Z", // Certificate validity start date (ISO 8601 format) "notAfter": "2025-01-14T23:59:59Z" // Certificate expiration date (ISO 8601 format) }, "sha256Fingerprint": "a1b2c3d4e5f6...abc123def456", // SHA-256 hash of the certificate (64 hex characters) }, }, }, }
关联连接函数
创建连接函数后,必须将其发布到 LIVE 阶段并与分配相关联。
发布并关联连接函数(控制台)
登录 AWS 管理控制台,并通过以下网址打开 CloudFront 控制台:https://console.aws.amazon.com/cloudfront/v4/home
。 -
在导航窗格中,选择函数
-
选择连接函数选项卡,然后选择您的连接函数。
-
选择发布以将其移至 LIVE 阶段。
-
在“发布”部分下,在关联的分配表中选择添加关联。
-
选择要关联的已启用查看器 mTLS 的分配。
或者,您也可以从分配详细信息页面关联已发布的连接函数。
-
导航到控制台主页,该页面上列出了您的所有分配。
-
选择要关联的分配。
-
选择常规选项卡。
-
在设置部分中,选择编辑。
-
在连接性部分中,找到查看器双向身份验证(mTLS)。
-
对于连接函数,选择您的函数。
-
选择保存更改。
关联连接函数(AWS CLI)
以下示例演示如何将连接函数与分配相关联:
// DistributionConfig: { ...other settings, "ConnectionFunctionAssociation": { "Id": "cf_30c2CV2elHwCoInb3LtcaUJkZeD" } }
连接函数的使用案例
连接函数支持多种高级 mTLS 使用案例:
-
证书属性验证:验证客户端证书中的特定字段,例如组织单元要求或主题备用名称模式。
-
证书吊销检查:使用 KeyValueStore 存储已吊销证书的序列号,以实施自定义证书吊销检查。
-
基于 IP 的证书策略:根据客户端 IP 地址或地理限制应用不同的证书策略。
-
多租户验证:实施特定于租户的验证规则,根据主机名或证书属性应用不同的证书要求。
注意
在 TLS 握手过程中,针对每个客户端连接运行一次连接函数。
连接函数只能允许或拒绝连接,而不能修改 HTTP 请求/响应。
仅 LIVE 阶段函数(已发布)能够与分配相关联。
每个分配可拥有最多一个连接函数。
后续步骤
将连接函数与 CloudFront 分配关联后,您可以配置可选设置以自定义 mTLS 实施的行为。有关配置其他设置(例如,可选的客户端证书验证模式)的详细说明,请参阅配置其他设置。