亚马逊AWS官方博客

利用 AWS Private CA 解决方案快速搭建符合 Matter 标准基础设施

简介

  • Matter,万物互联的基础,一种将兼容设备和系统相互连接的协议,是一项智能家居的开源标准,由连接标准联盟(CSA)制定、认证、推广。Matter 协议基于互联网协议(IP),支持来自不同供应商的智能家居设备在本地进行协同工作。为了使智能家居设备符合 Matter 标准,制造商需要对这些设备进行认证,并为其预置设备认证证书(DAC)。2022 年 10 月 4 日,Matter 1.0 标准正式发布并开放认证。
  • AWS Private Certificate Authority(AWS Private CA) 是一个高可用性的多功能 CA,可帮助企业使用私有证书保护其应用程序和设备, 并满足您的监管和合规性需求。 如果想要使用 AWS PCA 手动构建符合 Matter 要求的 IoT 证书体系,则可以参考另外一篇博客,那篇博客使用了 Java code 来生成 DAC 证书,而本篇 AWS Private CA 解决方案更为全面且不需要编写任何代码。
  • AWS Private CA 解决方案是一个 AWS 开源示例,用以帮助创建符合 Matter 标准的证书授权,是一个用以大规模生成 DAC 证书的解决方案。该解决方案使用 AWS 云开发工具包(CDK) 脚本和 AWS CloudFormation 堆栈模板,以帮助您创建颁发 Matter 设备认证证书(DAC)的证书授权(CA)。在颁发设备认证证书(DAC)之前,您必须向 CSA 提供证据,证明您的 Matter CA 的操作符合 Matter PKI CP(Certificate Policy)。 而该解决方案不仅构建 CA,还创建帮助您遵守 Matter PKI CP 所需的配置和审计基础结构。这包括 AWS Identity and Access Management(IAM)角色和权限、日志配置和保留策略。

另外 AWS Private Certificate Authority 还发布了 Matter PKI 合规性客户指南,该指南现在可以在 AWS Artifact 上下载(需要登录 AWS)。

毫无疑问,Matter 的诞生给很多设备制造厂商带来了大量的机会,而 CSA 联盟目前已经由亚马逊、苹果、谷歌、三星 SmartThings,Zigbee 联盟,海尔等 300 多家成员组成,而 Matter 也将成为 IoT 的基础和未来,那么抢先入局,获得更大的机会无疑在这个新兴的市场尤为重要。

接下来我们会展示该解决方案的架构图和一步一步完成该解决方案的搭建。

所需条件

  • 一个 AWS 账号。
  • 具有管理员权限的 EC2 角色或者管理员用户的 Access Key 和 Secret Key。
  • 一台执行 CDK 项目的机器,本例使用 AWS EC2,操作系统镜像为 Amazon Linux 2023,本次实验我已经提前安装了 Java JDK,需要安装 Java JDK 11或以上。

架构图

该解决方案会生成 4 个角色,分别为 MatterManagePAARole(负责查看, 启用和禁用 PAA 证书),MatterIssuePAIRole(负责使用指定的 PAA 颁发 PAI 证书,管理 PAI 证书),MatterIssueDACRole(负责使用指定的 PAI 颁发,下载,吊销 DAC 证书)和 MatterAuditorRole(负责创建 PAA 和 PAI 证书审计报告,并查看 CloudWatch 证书审计日志)。整体大致流程如下:

  1. 应用程序为设备生成 DAC 证书签名请求文件和私钥,并将后缀为 csr 的 DAC 证书签名请求文件上传到该解决方案生成的 S3 存储桶。上传路径格式为 s3://matterstackpai-dacinputs3tosqss3bucketxxx/arn:aws:acm-pca:<region>:<account>:certificate-authority/<PAI UUID>/<PID>/xxx.csr。
  1. DAC 证书签名请求文件上传到 S3 存储桶后,触发 S3 事件通知,将该 S3 事件消息发送到 SQS 消息队列中。
  2. 当 SQS 收到消息事件后,触发 Lambda 函数。
  3. 该 Lambda 函数调用 IssueCertificate API 访问 PCA PAI 证书,以对 DAC 证书签名请求文件进行签名。
  4. 然后该 Lambda 函数继续调用 GetCertificate API 获取证书内容,并把证书文件写入到上面的 S3 存储桶中。
  5. 应用程序从 S3 下载设备 DAC 证书,同时也可以将设备和证书的相关信息存到数据库中,如设备 UUID,证书 CN,证书 ARN,证书有效期等。
  6. 另外该解决方案会配置 CloudTrail 跟踪,将 AWS 云上审计日志分别存储到 S3 和 CloudWatch,并对该 CloudWatch 日志组配置指标筛选条件,创建 PCA 和 IAM Role API 调用监控指标, 最后该解决方案还会使用 Backup 服务定期备份 S3 上的审计日志。

操作步骤

接下来,我们会一步一步地演示如何部署该解决方案。该解决方案位于 Github 上面。

1. 登录到操作机器,配置 AWS 访问权限,本例使用为 EC2 分配管理员角色方式。也可以在机器上配置管理员 Access Key 和 Secret Key

2. 下载该解决方案 CDK 项目,并安装所需的 gradle,nvm 和 nodejs 依赖包。

wget https://services.gradle.org/distributions/gradle-8.3-bin.zip
mkdir /opt/gradle && unzip -d /opt/gradle gradle-8.3-bin.zip
ln -s /opt/gradle/gradle-8.3/bin/gradle /bin/gradle
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
. ~/.nvm/nvm.sh
nvm install --lts
git clone https://github.com/aws-samples/aws-private-ca-matter-infrastructure.git
cd aws-private-ca-matter-infrastructure/
npm install -g aws-cdk(确保 CDK 版本为 2.96.0 及以上,cdk version 可查看 cdk 版本, 或者安装 cdk 指定版本 npm install -g aws-cdk@2.96.2 ) 
npm install
gradle build
npm run build

3. Bootstrap AWS 环境以便后续将 CDK 代码部署到该环境中。

cdk bootstrap

4. 配置和部署该解决方案。

a)使用如下命令生成新的 PAA,并按提示步骤完成部署。该命令设置 PAA 证书 Subject CN 为 AnyCompany Matter PAA,Subject Organization 为 AWS, vid 为 FFF1,有效期到 2033 年 9 月 15 日 9 点 15 分 0 秒。具体这些参数值请根据实际情况进行修改。如果想创建多个 Matter PAA infrastructures,则可以添加参数 –context stackNamePrefix=<PREFIX>,为 CDK 创建的 PAA CloudFormation 堆栈指定不同的前缀名称。

cdk deploy --context generatePaa=1 --parameters vendorId=FFF1 --parameters validityEndDate=20330915091500  --parameters paaCommonName='AnyCompany Matter PAA' --parameters paaOrganization=AWS

b)部署完成后,会输出 CloudTrail Arn,CloudWatch LogGroupName,PAA Cert Arn 等。

c)打开 AWS Private Certificate Authority 服务,可以看到 PAA 已经部署成功。

d)使用如下命令生成新的 PAI 证书。generatePaiCnt 设置生成的 PAI 的数量,paaArn 为上面生成的 PAA ARN,paiCommonNames 设置多个 PAI 的 Subject CN,以逗号间隔。paiOrganizations 设置多个 PAI 的 Subject Organizations,以逗号间隔,productIds 设置多个 PAI pid 的值,同样以逗号间隔。validityEndDate 设置 PAI 的终止日期,dacValidityInDays 设置 PAI 默认颁发 DAC 证书的有效天数。具体这些参数值请根据实际情况进行修改, 更多参数配置可参考上述 Github README。如果想创建多个 Matter PAI,则可以添加参数 –context stackNamePrefix=<PREFIX>,为 CDK 创建的 PAI CloudFormation 堆栈指定不同的前缀名称。

cdk deploy --context generatePaiCnt=1 --parameters paaArn=<Your PAA ARN> --parameters productIds=8000 --parameters validityEndDate=20280915091500 --parameters dacValidityInDays=1095  --parameters paiCommonNames='AnyCompany Matter PAI 01' --parameters paiOrganizations=AWS

上面命令中没有包含参数 organizationalUnits,该参数为可选项,可以设置多个 OU,以逗号间隔,如果希望包含此参数,请添加 –parameters organizationalUnits=<OU1>,<OU2>。

e)PAI 证书部署完成后,会生成一些资源供后续使用。

S3:matterstackpai-dacinputs3tosqss3bucketxxx

SQS:MatterStackPAI-DacInputS3ToSQSqueuexxx,以及 DLQ MatterStackPAI-DacInputS3ToSQSdeadLetterQueuexxx

Lambda:MatterStackPAI-SqsToDacIssuingLambdaLambdaFunction-xxx

f)转到 PCA 服务控制台,查看 PAI 证书。

5. 到目前为止我们已经部署完成了该解决方案,并创建了 PAA 和 PAI CA 证书。如果需要更多的 PAI CA 证书,则只需要再次执行上述 d 步骤即可。

6. 接下来我们在 EC2 上执行 Openssl 生成设备 DAC 证书签名请求文件,并上传到 S3 存储桶上以生成 DAC 证书文件。

cd certificates

修改当前目录下 config.ssl 配置文件中的 output_password,该密码将被用于加密生成的 DAC 证书的私钥,因此请妥善保管。

如果当前使用 OpenSSL 版本低于 3.0,如 1.1,那么还需要修改 config.ssl 如下:

[ req ]
output_password = 1234
req_extensions = v3_extensions
distinguished_name = req_distinguished_name

[req_distinguished_name]

[ v3_extensions ]
basicConstraints = critical, CA:false
keyUsage = critical, digitalSignature
subjectKeyIdentifier = hash

生成椭圆曲线加密算法所需的参数文件。

openssl ecparam -name prime256v1 -out ecparam

按照实际需要修改下面命令中的 Subject 的取值。另外请替换下面命令中的 key1,cert1 为唯一的名字,避免之后大规模生成 DAC 证书时出现同名覆盖的情况,例如可以使用设备的 uuid 进行代替等,下文的 cert1.csr, cert1.pem 需要相应处理。

openssl req -config config.ssl -newkey param:ecparam -keyout key1.pem -out cert1.csr -sha256 -subj "/CN=DAC 1"

查看该 DAC 证书签名请求文件信息。

openssl req -text -in cert1.csr

上传该 cert1.csr 文件到上面 PAI 证书部署后生成的 matterstackpai-dacinputs3tosqss3bucketxxx 存储桶。

aws s3 cp cert1.csr s3://matterstackpai-dacinputs3tosqss3bucketxxx/<Your PAI ARN>/<PID>/cert1.csr

7. 上传完成后会自动触发 S3 事件通知机制,最终调用上述的 Lambda 函数自动在 S3 上 DAC 证书签名请求文件相同路径下生成 DAC 证书 pem 文件,下载该 DAC 证书到该机器当前目录下。

aws s3 cp s3://matterstackpai-dacinputs3tosqss3bucketxxx/<Your PAI ARN>/<PID>/cert1.pem . 

8. 使用下列命令查看该证书信息。

openssl x509 -text -in cert1.pem

9. 在上面创建 PAI 证书的过程中,我们指定了 DAC 证书的有效期为 1095 天,如果我们希望修改该天数,可以去 Lambda 控制台直接修改该函数的环境变量即可。但请注意,在生成 PAI 证书的步骤中,我们指定了 PAI 证书的有效期为 1825 天,而 DAC 证书的终止日期不能超过 PAI 证书的终止日期,即需要保证当前申请的 DAC 证书有效天数小于或等于 PAI 证书的终止日期减去申请当天的日期后的天数。

10. 如果我们想要使用自己创建的存储桶存放 DAC 证书签名请求文件和证书文件也很简单,只需要在选定的桶的属性配置里面添加事件通知,配置事件目标为上述创建好的 SQS 队列即可。



总结

在本篇博客中,我们介绍了如何使用 AWS Private CA 解决方案快速搭建符合 Matter 标准的 PKI 基础设施,并使用 openssl 模拟设备 DAC 证书生成过程。在实际大规模 DAC 证书颁发的过程中我们可以使用脚本生成大量的 DAC 证书签名请求文件,并将这些文件上传到 AWS S3 来自动化完成大规模 DAC 证书颁发。同时该方案利用 S3,SQS 和 Lambda 等 Serverless 架构提高了业务敏捷性并优化了成本, 而使用 AWS Private CA 大规模颁发 DAC 证书也是具有非常高的性价比的。

本篇作者

张春明

亚马逊云科技解决方案架构师,对于操作系统,网络,数据库,安全都有深入的了解。他帮助客户设计云上解决方案,并致力于解决客户使用过程中遇到的各种疑难杂症,加速客户云上业务构建。在业余时间,他喜欢学习新技术、听歌、阅读小说、骑行和滑雪等。他信奉的人生格言是人生苦短,何妨一试。