亚马逊AWS官方博客

为在 AWS Private CA 中托管的 Matter CA 开启 CRL

概述与背景

Matter 是一种新的开放标准,它由连接标准联盟(CSA)管理,用于智能家居设备之间实现无缝且安全的跨厂商连接。它为不同厂商生产的设备提供了一种通用语言,使这些设备能够通过 Wi-Fi 和 Thread 无线协议在智能家居网络上进行通信。

Matter 标准使用公钥基础设施(Public Key Infrastructure, PKI)来认证设备。具体来说,Matter 标准依托名为设备认证证书(DAC)的数字证书以及认证声明(Certification Declaration, CD)来验证智能家居网络中的设备是否已通过 Matter 认证。由于此证书的重要性,因此,Matter 要求签发设备认证证书(DAC)的 CA 应符合 Matter PKI 证书策略(Certificate Policy,CP)。新版本的 Matter PKI 证书策略要求 CA 应使用证书吊销列表(CRL)来声明被吊销的证书。

AWS Private CA 服务支持符合 Matter 标准的 CRL,本文介绍了如何为托管在该服务中的 Matter CA 开启 CRL 以满足 Matter PKI 证书策略的要求。

准备工作

  • 使用具备 AWS Private CA 及 Amazon S3 服务管理员权限的 IAM 用户或角色执行操作
  • 安装 AWS CLI,并正确配置 AWS CLI 配置文件使用上述 IAM 用户或角色

为 Matter CA 开启 CRL

步骤一:创建 Amazon S3 存储桶

AWS Private CA 使用 S3 存储桶来存放 CRL 文件,因此首先我们需要创建该 S3 存储桶。

1. 打开 S3 控制台,在控制台右上角切换到您希望创建 S3 存储桶的区域,然后在页面左侧导航栏选择“存储桶”,之后在存储桶页面单击“创建存储桶”按钮。

2. 参考如下内容对 S3 存储桶进行配置,并单击“创建存储桶”按钮:

  • 存储桶类型:选择“通用”
  • 存储桶名称:填写恰当的存储桶名称,确保符合命名规范
  • 对象所有权:选择“ACL 已禁用(推荐)”
  • 默认加密:选择“使用 Amazon S3 托管密钥进行服务器端加密(SSE-S3)”

3. 在存储桶列表页面单击该存储桶,然后在“权限”标签页编辑存储桶策略。

输入以下存储桶策略,注意替换其中的 your-bucket-name 及 your-account-id 为您的实际数值。说明:本策略中包含两个 statement,Sid 为“AllowPCAUpdateCRL”的 Statement 用于使 AWS Private CA 服务具备向该存储桶上传 CRL 文件的权限。Sid 为“AllowPublicReadCRL”的 Statement 用于 CRL 文件的公开访问。

如果不计划使用该 S3 存储桶对互联网公开提供 CRL 的下载(例如,当您定期将 CRL 文件从 S3 存储桶复制至自建 HTTP 服务以对外提供 CRL 访问时),您应该删除 Sid 为“AllowPublicReadCRL”的 Statement。若直接使用该 S3 存储桶对外提供 CRL 下载,在应用此策略前,请确保该存储桶的“屏蔽公共访问权限”没有勾选“阻止所有公开访问”,并且 AWS 账户级别的“阻止通过新公有存储桶策略或接入点策略授予的存储桶和对象公有访问”及“阻止通过任何公有存储桶策略或接入点策略对存储桶和对象的公有和跨账户访问”没有被勾选(如下图),否则您将无法应用该策略。在应用此策略后,您可以选择再次打开 AWS 账户级别的“阻止通过新公有存储桶策略或接入点策略授予的存储桶和对象公有访问”。

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "AllowPCAUpdateCRL",
			"Effect": "Allow",
			"Principal": {
				"Service": "acm-pca.amazonaws.com"
			},
			"Action": [
				"s3:PutObject",
				"s3:PutObjectAcl",
				"s3:GetBucketAcl",
				"s3:GetBucketLocation"
			],
			"Resource": [
				"arn:aws:s3:::your-bucket-name/*",
				"arn:aws:s3:::your-bucket-name"
			],
			"Condition": {
				"StringEquals": {
					"aws:SourceAccount": "your-account-id"
				}
			}
		},
		{
			"Sid": "AllowPublicReadCRL",
			"Effect": "Allow",
			"Principal": "*",
			"Action": "s3:GetObject",
			"Resource": "arn:aws:s3:::your-bucket-name/crl/*"
		}
	]
}

步骤二:为 Matter CA 开启 CRL

通常,证书内容中会包含用于分发 CRL 的 URL,以便客户端可以知道从何处下载已吊销证书的列表。Matter 标准要求 CA 将 CRL 的 URL 通过分布式合规账簿(DCL)来进行发布而非嵌入到证书内容中,因此在 AWS Private CA 中为 Matter CA 开启 CRL 时,需要指定特定参数来忽略 CRL distribution point(CDP)extension。该参数目前仅可通过 AWS Private CA API、CLI 或 AWS CloudFormation 来进行设置。

对于新建 Matter CA,您可以参照用户手册中的 Java 示例代码来创建 PAA 及 PAI,其中的 crlConfigure 对象用于声明 CRL 相关配置。

对于尚未开启 CRL 的现存 Matter CA,您可以参考下面的 AWS CLI 命令来开启 CRL,请注意替换其中的 your-ca-arn,your-bucket-name,your-pca-region 为您的实际数值,并且 ExpirationInDays 的值符合 Matter PKI 证书策略中的要求:

aws --region your-pca-region acm-pca update-certificate-authority \
     --certificate-authority-arn your-ca-arn \
     --revocation-configuration 'CrlConfiguration={Enabled=true,CrlDistributionPointExtensionConfiguration={OmitExtension=true},ExpirationInDays=365,S3BucketName=your-bucket-name,S3ObjectAcl=BUCKET_OWNER_FULL_CONTROL}'

步骤三:检查 CRL 是否成功创建

开启 CRL 后,AWS Private CA 服务会在 S3 存储桶生成 acm-pca-permission-test-key 或 acm-pca-permission-test-key-private 文件以验证是否具有 S3 存储桶写入权限。若该文件不存在,请检查步骤一中是否正确配置了存储桶策略以及屏蔽公共访问权限的设置。

在执行步骤二中的 CRL 开启命令后,等待 30 分钟,将可以在 S3 存储桶的 crl 目录中看到名为 your-ca-id.crl 的文件(如下图),此时说明 CRL 已正确生成。

步骤四:发布 CRL

您需要将 CRL 文件的 URL 发布至 Matter DCL,相关步骤请参照 CSA 规定的相关流程。关于如何获取 CRL 文件的 URL,请参考如下步骤。

  • 若使用 S3 存储桶直接对外提供 CRL 的下载且使用 S3 默认域名:

在 S3 控制台单击指定 crl 文件,在属性页面可以看到该 CRL 文件的对象 URL,将其中的 https 替换为 http 即可。

说明:您还可以使用 Amazon CloudFront 来作为 CDN 对存储在 S3 中的 CRL 文件的访问进行边缘网络加速,相关配置可以参考该文档中的步骤。此时,您应使用 CloudFront 提供的指定域名来替换对象 URL 中的 S3 域名。

  • 若使用 S3 存储桶直接对外提供 CRL 的下载且使用自定义域名:

1. S3 服务通过请求中的 hostname 来确定存储桶名称,因此使用此方式时,用于存储 CRL 文件的 S3 存储桶名称需要与您的自定义域名一致,例如当您希望使用 crl.example.test 域名对外提供 CRL 访问时,步骤一中创建的存储桶名称也应设置为 crl.example.test,有关为 S3 设置 CNAME 的更多信息请参考该文档

2. 在您的 DNS 服务中,创建 CNAME 记录,将您的自定义域名指向<your-bucket-name>.s3.<your-bucket-region>.amazonaws.com。之后在 DCL 中请使用形如 http://your-bucket-name/crl/ca-id.crl 的 URL。

注意:当您在 DNS 服务中为 S3 存储桶创建了 CNAME 后,请务必确保 S3 中存在匹配的桶且由您控制。否则,任何 AWS 用户都可以使用该名称创建 S3 存储桶并在您的对应域名下发布内容,这会为您带来安全风险。同理,当您不使用该 S3 存储桶时,请务必在 DNS 中删除对应的 CNAME 记录。

  • 若使用自建 HTTP 服务对外提供 CRL 的下载:

您需要定期将 S3 中的 CRL 文件拷贝至您的 HTTP 服务中,并在 DCL 中指定您自己的 CRL 文件 URL。您可以使用 S3 服务的事件通知功能来捕获 CRL 文件的更新事件,并借助 Amazon SNS 来收取邮件通知,或者您也可以借助 AWS Lambda 来自动处理 CRL 文件的更新,例如在 Lambda 中编写向您的 HTTP 服务上传 CRL 文件的逻辑,通过这样的方式,每当 Amazon Private CA 在更新 S3 存储桶中的 CRL 文件后,HTTP 服务中的对应文件都可以得到自动的更新。

您可以参考如下步骤来创建 CRL 更新的 S3 事件通知,有关 S3 事件通知的详细设置请参考该文档

1. 在 S3 控制台单击存储 CRL 文件的 S3 存储桶,单击“属性”标签页。

2. 在属性页面上找到事件通知,单击“创建事件通知”按钮。

3. 输入事件名称,前缀可以设置为“crl/”, 后缀设置为“.crl”,事件类型中勾选“所有对象创建事件”。

页面下拉至“目标”设置部分,选择需要接收并处理该通知事件的 Lambda 函数或 SNS 主题,然后单击“保存更改”按钮。

执行吊销

当计划对 CA 所签发的证书(PAI 或 DAC)进行吊销时,您需要按照 Matter PKI 证书策略中要求的吊销步骤来执行证书吊销并满足相关的核验和通知的要求。

您可以使用 AWS CLI 或 Amazon Private CA API 来吊销已签发的证书, 可以参考如下步骤来执行吊销操作:

1. 当 CA 没有吊销任何证书时,您可以下载 CRL 文件到本地并使用如下 openssl 命令进行解析,请将 path-to-crl-file 替换为您的 CRL 文件路径。在输出中将可以看到“No Revoked Certificates.”,表示没有任何被吊销的证书。

openssl crl -text -noout -inform DER -in path-to-crl-file

2. 使用如下 AWS CLI 命令对指定证书执行吊销,请注意替换其中的 your-ca-arn,target-serial-number,your-pca-region 为您的实际数值。其中,当吊销 DAC 时,your-ca-arn 应为签发该 DAC 所使用的 PAI 的 arn;当吊销 PAI 时,your-ca-arn 应为 PAA 的 arn;target-serial-number 应为需要被吊销的证书的序列号。此外 revocation-reason 请选取恰当的原因,当前 AWS Private CA 支持的吊销原因请见该文档

aws --region your-pca-region acm-pca revoke-certificate \
     --certificate-authority-arn your-ca-arn \
     --certificate-serial target-serial-number \
     --revocation-reason "KEY_COMPROMISE"

若您不知道目标证书的序列号,您可以通过以下几种方式之一进行获取:

  • 若有目标证书的文件(pem 或 der 格式),可使用如下 openssl 命令解析并获取证书序列号。
    openssl x509 -text -noout -inform PEM|DER -in path-to-cert-file.pem|.der
  • 若有目标证书的 arn,可使用如下 AWS CLI 命令(或使用 Amazon Private CA API)来获取证书文件,请注意替换其中的 your-ca-arn,target-certificate-arn,your-pca-region 为您的实际数值。然后使用前述 openssl 命令获取证书序列号。
    aws --region your-pca-region acm-pca get-certificate \
    --certificate-authority-arn your-ca-arn \
    --certificate-arn target-certificate-arn
    
  • 生成 CA 的审计报告,在其中根据 Subject 名称查询对应的证书的序列号。详细操作步骤请参考该文档

3. 执行证书吊销指令后,S3 存储桶中的 CRL 文件通常在 30 分钟左右可以被更新,下载该文件并使用步骤 1 中的 openssl 命令解析文件,可观察到输出中的 Revoked Certificates 列表里将包含之前吊销的证书序列号、吊销时间及吊销原因等信息。

总结

本文介绍了如何为托管在 Amazon Private CA 中的 CA 来开启符合 Matter 标准的证书吊销列表(CRL),以及如何使用 AWS CLI 来执行证书吊销和使用 openssl 工具来查验证书吊销列表中的内容。您应该在最新版 Matter PKI 证书策略中要求的强制期限之前为您所管理的 PAA 及 PAI 开启 CRL,并对符合 Matter PKI 证书策略中所描述的需要吊销的场景的证书执行吊销操作。

本篇作者

王旭东

亚马逊云科技安全产品解决方案架构师,负责帮助客户进行安全解决方案的架构设计。在加入亚马逊云科技之前,曾在互联网 SaaS 企业负责公司基础架构安全建设及治理。