Mock测试【免费下载链接】motoA library that allows you to easily mock out tests based on AWS infrastructure.项目地址https://gitcode.com/gh_mirrors/mo/moto点击查看免费下载导读本文以 Moto 仓库中 acm-pca 服务文档 为核心系统讲解如何在本地开发与测试中完整模拟 AWS Private Certificate AuthorityACM Private CA / acm-pca服务从创建私有 CA、获取 CSR、签发根证书与终端实体证书到吊销证书、管理标签与资源策略的完整生命周期。读完本文你将掌握该服务在 Moto 中已实现的全部 API 用法、未实现参数的真实行为边界以及其基于cryptography库的底层实现原理可直接用 boto3 在测试中复现真实的 PKI 工作流。一、服务概述Moto 如何模拟 acm-pcaMoto 的 acm-pca 模拟位于moto/acmpca/目录遵循 Moto 标准的「Backend模型层— Response协议层— URL路由层」三段式架构models.py定义ACMPCABackend与CertificateAuthority模型持有全部状态与业务逻辑responses.py解析 boto3 发来的 JSON 请求体调用 Backend 方法并序列化响应urls.py注册https?://acm-pca\.(.)\.amazonaws\.com端点将请求分发给ACMPCAResponse.dispatch同时在 backend_index.py 中完成服务路由注册。与真实 AWS 一样Moto 的 CA 状态机也遵循「先创建PENDING_CERTIFICATE→ 签发并导入证书ACTIVE→ 可更新DISABLED→ 可删除DELETED」的流转路径。在测试中只需为 boto3 客户端加上mock_aws装饰器即可让boto3.client(acm-pca)的所有请求落到本地模拟实现上。二、功能覆盖总览依据 docs/docs/services/acm-pca.rst 的实现清单目前共实现 15 个 API未实现 5 个具体如下状态API说明✅ 已实现create_certificate_authority创建私有 CA部分参数未实现见下文❌ 未实现create_certificate_authority_audit_report—❌ 未实现create_permission—✅ 已实现delete_certificate_authority将 CA 状态置为DELETED❌ 未实现delete_permission—✅ 已实现delete_policy删除附加到私有 CA 的资源策略✅ 已实现describe_certificate_authority返回 CA 详情❌ 未实现describe_certificate_authority_audit_report—✅ 已实现get_certificate获取已签发证书与证书链✅ 已实现get_certificate_authority_certificate获取 CA 自身的证书与链✅ 已实现get_certificate_authority_csr获取 CA 的 CSR✅ 已实现get_policy检索附加到私有 CA 的资源策略✅ 已实现import_certificate_authority_certificate导入 CA 证书使其激活✅ 已实现issue_certificate签发证书部分参数未实现见下文✅ 已实现list_certificate_authorities列出私有 CA支持分页与ResourceOwner过滤❌ 未实现list_permissions—✅ 已实现list_tags列出标签分页未实现✅ 已实现put_policy附加资源策略到私有 CA❌ 未实现restore_certificate_authority—✅ 已实现revoke_certificate吊销证书✅ 已实现tag_certificate_authority/untag_certificate_authority增删标签文档同时明确标注了两处参数缺口create_certificate_authority未实现IdempotencyToken、KeyStorageSecurityStandard、UsageMode三个参数issue_certificate未实现ApiPassthrough、SigningAlgorithm、Validity、ValidityNotBefore、IdempotencyToken五个参数且证书的部分字段将采用默认值而非完全取自 CSR。后文将逐一说明这些缺口的实际影响。三、创建私有 CAcreate_certificate_authority创建 CA 是全部 PKI 流程的起点。以下代码直接取自仓库测试 tests/test_acmpca/test_acmpca.py可原样运行import boto3 from moto import mock_aws mock_aws def test_create_certificate_authority(): client boto3.client(acm-pca, region_nameeu-west-1) resp client.create_certificate_authority( CertificateAuthorityConfiguration{ KeyAlgorithm: RSA_4096, SigningAlgorithm: SHA512WITHRSA, Subject: {CommonName: yscb41lw.test}, }, CertificateAuthorityTypeSUBORDINATE, IdempotencyTokenterraform-20221125230308947400000001, ) print(resp[CertificateAuthorityArn]) # 输出形如arn:aws:acm-pca:eu-west-1:123456789012:certificate-authority/uuid3.1 核心参数说明CertificateAuthorityConfiguration必填含KeyAlgorithm如RSA_4096、SigningAlgorithm如SHA512WITHRSA与Subject。Subject支持CommonName、Country、State、Organization、OrganizationalUnit等字段模型层在 models.py 的issuer属性中按固定顺序映射为 X.509 名称属性。CertificateAuthorityType必填ROOT或SUBORDINATE。RevocationConfiguration可选吊销配置详见下文 CRL 配置一节。Tags可选创建时即打标签backend 会同步到内部TaggingService见 models.py。3.2 未实现参数的真实行为文档明确声明IdempotencyToken、KeyStorageSecurityStandard、UsageMode尚未实现。从 models.py 的签名可以看出backend 的create_certificate_authority只接收配置、吊销配置、类型、安全标准与标签五个参数——IdempotencyToken被 boto3 侧直接忽略重复请求会创建新的 CA 而非幂等复用UsageMode在模型中被固定为SHORT_LIVED_CERTIFICATEmodels.py而KeyStorageSecurityStandard参数虽然会被接收并透传但即便不传模型也会默认赋值为FIPS_140_2_LEVEL_3_OR_HIGHERmodels.py测试test_describe_certificate_authority验证了这一默认值。3.3 创建后的内部状态每次创建时模型会同步执行以下初始化见 models.py生成一个随机 UUID 作为 CA 的id并组装出标准 ARNarn:{partition}:acm-pca:{region}:{account_id}:certificate-authority/{id}用cryptography生成RSA-2048 私钥rsa.generate_private_key(public_exponent65537, key_size2048)并以随机口令做 PEM 加密存储私钥字节以BestAvailableEncryption方式持久化保证 backend 可被 pickle 序列化测试test_acmpca_backend_is_serialisable专门验证了这一点状态初始为PENDING_CERTIFICATE记录created_at时间戳吊销配置默认值为{CrlConfiguration: {Enabled: False}}。四、CA 生命周期获取 CSR 并激活 CA4.1 获取 CSRget_certificate_authority_csr创建后 CA 处于PENDING_CERTIFICATE需要先取出 CSR 自签根证书才能激活csr client.get_certificate_authority_csr(CertificateAuthorityArnca_arn)[Csr] # csr 为 PEM 格式的字符串可直接交给 openssl 或 cryptography 解析从 models.py 看CSR 由x509.CertificateSigningRequestBuilder生成主体使用 CA 的issuer名称即创建时传入的Subject并附带 critical 的BasicConstraints(caTrue, path_lengthNone)扩展用 SHA256 签名。测试test_get_certificate_authority_csr验证了 CSR 中CommonName、Country、State、Organization、OrganizationalUnit各字段与创建参数一致。4.2 签发根证书并导入激活激活 CA 的标准流程分三步先issue_certificate用根 CA 模板签发自身证书再get_certificate取回证书最后import_certificate_authority_certificate导入# 1) 签发根证书 cert_arn client.issue_certificate( CertificateAuthorityArnca_arn, Csrcsr, SigningAlgorithmSHA256WITHRSA, TemplateArnarn:aws:acm-pca:::template/RootCACertificate/V1, Validity{Type: YEARS, Value: 10}, )[CertificateArn] # 2) 取回证书 PEM ca_cert client.get_certificate( CertificateAuthorityArnca_arn, CertificateArncert_arn )[Certificate] # 3) 导入证书CA 状态变为 ACTIVE client.import_certificate_authority_certificate( CertificateAuthorityArnca_arn, Certificateca_cert )import_certificate_authority_certificate的实现models.py会先尝试解析 PEM 证书若解析失败则抛出MalformedCertificateAuthorityException测试用invalid certificate pem验证成功后写入证书字节、可选证书链并将状态置为ACTIVE、刷新updated_at。导入后describe_certificate_authority返回的NotBefore/NotAfter字段也会随证书填充见 models.py。4.3 状态约束注意get_certificate_authority_certificate获取 CA 自身证书要求 CA 状态为ACTIVE否则抛出InvalidStateExceptionmodels.py测试test_get_certificate_authority_certificate验证了在PENDING_CERTIFICATE状态下调用会返回错误码InvalidStateException及对应错误消息。而get_certificate_authority_csr则不受状态限制随时可调用。五、签发终端实体证书issue_certificateCA 激活后即可对外签发证书。核心实现位于 models.py 的issue_certificate与 models.py 的_x509_extensionsprivate_key rsa.generate_private_key(public_exponent65537, key_size2048) ee_csr create_csr(private_key, US, WA, BezosCorp, bezoscorp.com) # 自行生成终端实体 CSR ee_cert_arn client.issue_certificate( CertificateAuthorityArnca_arn, Csree_csr, SigningAlgorithmSHA256WITHRSA, Validity{Type: YEARS, Value: 1}, )[CertificateArn]5.1 模板TemplateArn驱动的扩展逻辑实现区分两类模板并据此注入不同的 X.509 扩展arn:aws:acm-pca:::template/RootCACertificate/V1注入 critical 的BasicConstraints(caTrue, path_lengthNone)、KeyUsage(crl_sign, key_cert_sign, digital_signature)以及SubjectKeyIdentifierarn:aws:acm-pca:::template/EndEntityCertificate/V1或未传 TemplateArn注入BasicConstraints(caFalse)、AuthorityKeyIdentifier取自已导入的 CA 公钥、SubjectKeyIdentifier、KeyUsage(digital_signature, key_encipherment)以及含SERVER_AUTH/CLIENT_AUTH的ExtendedKeyUsage。此外CSR 中的 Subject Alternative NameSAN扩展会被原样透传到新证书models.py。测试test_end_entity_certificate_issuance验证了 SAN 中的 DNS、邮箱RFC822、OtherName 与 URI 均被保留。5.2 签发产物的内部行为新证书用 SHA512 签名有效期固定为自当前时间起 365 天models.py即文档所述「证书部分字段使用默认值而非 CSR」的具体体现——Validity、SigningAlgorithm等参数虽可传入但未生效证书序列号由x509.random_serial_number()随机生成签发的证书以certificate-authority/{ca_id}/certificate/{cert_id}形式的 ARN 存储其中cert_id为去除连字符的 UUID根 CA 证书RootCACertificate 模板签发不带证书链而终端实体证书会附带 CA 证书作为链models.py。测试test_root_certificate_has_no_chain与test_end_entity_certificate_includes_chain分别验证了两种行为。5.3 签名算法默认值说明由于SigningAlgorithm参数未实现所有证书的签名算法由代码固定CSR 生成用 SHA256证书签发用 SHA512。如果你在测试中断言签名算法需要注意这一点。六、检索证书get_certificate 与 get_certificate_authority_certificate两个 API 用途不同get_certificate检索issue_certificate签发的证书含链。响应中根证书不包含CertificateChain字段终端实体证书则返回 CA 证书作为链responses.py。如果证书已被吊销该方法会抛出RequestInProgressException详见下节。get_certificate_authority_certificate检索 CA 自身的证书与链要求状态为ACTIVE。响应中的CertificateChain会尝试 Base64 解码解码失败则按原始字符串返回responses.py。测试 tests/test_acmpca/test_acmpca.py 还验证了证书链必须是合法 PEM 且可被cryptography正常加载保证返回内容具备真实的 X.509 可验证性——在test_end_entity_certificate_issuance中Moto 签发的终端实体证书甚至能通过cryptography.x509.verification的证书链验证信任存储中放入 CA 证书验证出长度为 2 的信任链。七、吊销证书revoke_certificate# 从证书 PEM 中解析序列号大写十六进制按字节加冒号分隔 cert_obj x509.load_pem_x509_certificate(test_cert.encode(utf-8)) serial_number format(cert_obj.serial_number, X) serial_number :.join( serial_number[i : i 2] for i in range(0, len(serial_number), 2) ) client.revoke_certificate( CertificateAuthorityArnca_arn, CertificateSerialserial_number, RevocationReasonKEY_COMPROMISE, )吊销的底层行为models.py仅允许对ACTIVE状态的 CA 执行吊销否则抛InvalidStateException吊销记录以证书序列号为键、以{revocation_reason: ..., revocation_time: ...}为值存入 CA 模型之后调用get_certificate时models.py 会从证书中反解序列号并比对吊销表命中即抛RequestInProgressException消息形如The certificate has been revoked with reason: KEY_COMPROMISE。测试test_revoke_certificate完整覆盖了「吊销前可取回 → 吊销后 get_certificate 报错」的闭环并直接通过 backend 状态断言了吊销原因与吊销时间均已记录。八、查询与管理 CA8.1 describe_certificate_authority返回 CA 的完整 JSON 视图models.py包含Arn、OwnerAccount、CertificateAuthorityConfiguration、Type、RevocationConfiguration、CreatedAt、Status、UsageMode、KeyStorageSecurityStandard以及状态变化后的LastStateChangeAt和导入证书后的NotBefore/NotAfter。对不存在的 ARN 调用会抛ResourceNotFoundException测试test_describe_unknown_certificate_authority验证。8.2 list_certificate_authorities支持分页与ResourceOwner过滤models.py分页模型定义于PAGINATION_MODELmodels.pyMaxResults默认上限为 100响应携带NextToken测试验证了MaxResults1时返回单条记录与分页令牌ResourceOwner取值SELF默认仅本账号或OTHER_ACCOUNTS仅其他账号通过比对account_id过滤结果按created_at倒序排列。8.3 update_certificate_authority 与 delete_certificate_authorityupdate_certificate_authority可更新Status如DISABLED与RevocationConfiguration并刷新LastStateChangeAt测试验证更新后Status变为DISABLED且出现LastStateChangeAtdelete_certificate_authority将状态置为DELETED软删除语义与真实 AWS 的删除后保留期行为方向一致。九、CRL 吊销配置的校验细节RevocationConfiguration.CrlConfiguration中有一个值得注意的S3ObjectAcl字段行为如下models.py未显式传入时默认值为PUBLIC_READ仅接受PUBLIC_READ与BUCKET_OWNER_FULL_CONTROL两个取值其他值抛出InvalidS3ObjectAclInCrlConfiguration错误消息中会列出合法取值exceptions.py。测试test_update_certificate_authority完整覆盖了默认值填充、显式传值覆盖与非法值报错三种场景是排查吊销配置问题时的最佳参考。十、标签管理tag / untag / list_tags三个 API 均基于 Moto 通用的TaggingServicemodels.pyclient.tag_certificate_authority( CertificateAuthorityArnca_arn, Tags[{Key: t1, Value: v1}, {Key: t2, Value: v2}], ) resp client.list_tags(CertificateAuthorityArnca_arn) # resp[Tags] [{Key: t1, Value: v1}, ...] client.untag_certificate_authority( CertificateAuthorityArnca_arn, Tags[{Key: t1, Value: v1}] )按文档标注list_tags的分页尚未实现tag_certificate_authority与untag_certificate_authority则直接透传至 tagger行为与 AWS 一致测试test_tag_certificate_authority、test_untag_certificate_authority验证了增删效果。十一、资源策略put_policy / get_policy / delete_policy三个策略 API 是文档中明确给出语义说明的功能put_policy将 JSON 字符串形式的资源策略附加到私有 CA要求 CA 状态为ACTIVE否则抛InvalidStateExceptionget_policy检索策略若从未设置过策略抛ResourceNotFoundExceptiondelete_policy清除策略。测试test_policy_operations给出了完整用例先激活 CA再put_policy写入包含Action: [acm-pca:IssueCertificate]的策略 JSONget_policy原样取回delete_policy后再次get_policy报ResourceNotFoundException。策略以字符串形式存于CertificateAuthority.policy字段models.py不做语法校验。十二、底层实现架构速览了解请求如何流转有助于排查边界行为。一次 boto3 调用的完整链路是请求命中 urls.py 注册的acm-pca.{region}.amazonaws.com端点responses.py 的ACMPCAResponse按 action 分发到对应处理方法将请求体json.loads后提取参数例如create_certificate_authority读取CertificateAuthorityConfiguration、RevocationConfiguration、CertificateAuthorityType、KeyStorageSecurityStandard、Tags调用 models.py 中ACMPCABackend的对应方法通过acmpca_backends[current_account][region]获取区域隔离的 backend 实例执行状态变更结果序列化为 JSON 返回。值得强调的是区域隔离acmpca_backends BackendDict(ACMPCABackend, acm-pca)models.py意味着不同 region 的 CA 相互独立而 ARN 中的 partition 会根据 region 正确推导如us-gov-east-1→aws-us-goveusc-de-east-1→aws-eusc测试对此做了参数化验证。十三、测试验证与常见坑位仓库的 tests/test_acmpca/test_acmpca.py 是功能行为的最佳规格说明书覆盖了创建、描述、CSR、签发、导入、吊销、策略、标签、分页、证书链等全部已实现 API。实践中的常见注意事项get_certificate_authority_certificate与put_policy都要求 CA 处于ACTIVE测试前务必先走完「签发根证书 → 导入」两步签发证书时如果不传TemplateArn默认按终端实体证书模板处理含caFalse与服务器/客户端认证扩展Validity与SigningAlgorithm参数暂未生效证书有效期固定为 365 天、签名算法固定为 SHA512若断言这些字段需要以实际实现为准吊销后get_certificate抛出的异常类型是RequestInProgressException而非常见的ResourceNotFoundException断言错误码时注意区分backend 是可 pickle 序列化的私钥以加密字节存储可在 LocalStack 等下游项目中安全持久化。结语Moto 的 acm-pca 实现已经覆盖了私有 CA 生命周期中最核心的 15 个 API足以支撑基于 boto3 的 PKI 相关测试证书签发、链验证、吊销、标签与策略管理。在编写测试时建议以 docs/docs/services/acm-pca.rst 的实现清单为功能边界以 tests/test_acmpca/test_acmpca.py 为行为参照并注意本文点明的若干未实现参数与默认值细节即可写出与真实 AWS 行为高度对齐的可靠测试。赞分享Mock测试【免费下载链接】motoA library that allows you to easily mock out tests based on AWS infrastructure.项目地址https://gitcode.com/gh_mirrors/mo/moto点击查看免费下载相关推荐使用 AWS CLI 安全删除 ACM Private CAaws acm-pca delete-certificate-authority 实战指南使用 AWS CLI 安全删除 ACM Private CA aws acm pca delete certificate authority 实战指南 导读开发工具云原生运维AWS CLI acm-pca import-certificate-authority-certificate 实战指南导入 CA 证书激活私有 CAAWS CLI acm pca import certificate authority certificate 实战指南导入 CA 证书激活私有 CA 导读开发工具云原生运维AWS CLI acm-pca revoke-certificate 实战指南私有证书吊销全流程解析AWS CLI acm pca revoke certificate 实战指南私有证书吊销全流程解析 导读 在 AWS Private Certificate开发工具云原生运维上一篇Open-Elevation源码解析深入理解GDAL高程查询实现原理下一篇AB Download Manager多线程下载架构深度解析与性能优化实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
Keil与Proteus联调实战:HEX装载、编译配置与避坑指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 2:53:00
Locomotive Scroll 快速上手:JavaScript 初始化、CSS 引入与水平滚动实战指南 【免费下载链接】locomotive-scroll 🛤 Detection of elements in viewport & smooth scrolling with parallax. 项目地址: https://gitcode.com/gh_mirrors/lo/locomotive-scroll 点击查看 免费下载 本篇技术指南围绕 Locomotive Scroll 官方文档中… · 2026/9/25 2:53:00
BAML C 桥接层程序引导证据探针:从编译器字节恒等到原生初始化失败缓存的完整验证 编程语言AI Agent编译器CLI人工智能 【免费下载链接】baml The programming language for agents 项目地址: https://gitcode.com/gh_mirrors/ba/baml 点击查看 免费下载 导读
BAML 编译器输出的 .baml 程序字节码最终要进入 C# 运行时,这一路径上每一… · 2026/9/25 3:31:01
猫抓 cat-catch:一款完整的浏览器资源嗅探扩展,把网页里只能看不能存的视频变成可下载文件 猫抓 cat-catch:一款完整的浏览器资源嗅探扩展,把网页里只能看不能存的视频变成可下载文件 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/… · 2026/9/25 3:31:01
Spring Boot+Vue校园失物招领系统毕设:表设计、状态流转与避坑指南 简介:这是一份面向计算机专业学生的毕业设计项目——校园失物招领系统完整源码包,适合用作课程设计、大作业或毕设答辩的参考范本。系统针对校园物品丢失与认领效率低的问题,涵盖信息发布、失物匹配、用户管理等典型功能,完整呈现… · 2026/9/25 3:31:01
从.wasm到ESP32完整应用:运行时、固件与实操指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 3:31:01
审计视角重构销售+渠道分销体系:三流管控与落地实操 销售渠道分销体系这事儿,我前前后后做了快十年。从最初在企业里跑市场、管渠道,到后来以审计视角回头审视这套体系,最大的感受是:大多数企业的销售问题根本不在销售端,而在体系端。业绩没增长,是渠道结构出… · 2026/9/25 3:30:55
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37