如何获取PENDING状态AWS ACM证书的CNAME名称与值
AWS ACM PENDING状态证书获取DNS验证CNAME记录方案
结论:完全可以在证书处于PENDING_VALIDATION状态时拿到需要的CNAME名称和值,「仅ISSUED状态返回对应字段」的认知存在偏差。
正确实现逻辑
你之前拿不到字段,基本是踩了SDK接口返回字段裁剪的坑,和证书状态无关,按以下步骤操作即可:
- 调用
ListCertificates接口拉取证书列表时,不要使用默认的状态过滤规则,主动在CertificateStatuses参数中加入PENDING_VALIDATION状态,拿到待验证证书的ARN列表。 - 不要直接使用
ListCertificates返回的证书摘要对象取CNAME字段:该接口为了控制响应体积,默认只返回证书基础信息,无论证书是什么状态,都不会携带域名验证相关的全量字段。 - 拿到证书ARN后,逐个调用
DescribeCertificate接口拉取单证书的全量详情,在返回的证书对象中找到DomainValidationOptions属性:只要你申请证书时选择的是DNS验证方式,证书创建完成后(无需等签发),该数组内每个域名对应的验证项中,都会携带ResourceRecord字段,里面就包含你需要的CNAME记录名称、值和记录类型。
特殊说明:如果申请证书时选择的是邮件验证方式,无论证书处于什么状态,都不会返回DNS验证对应的CNAME记录,该逻辑和证书状态无关,仅和验证方式选择有关。
.NET SDK 参考代码
// 初始化ACM客户端,提前配置好访问凭证、对应部署区域 using var acmClient = new AmazonCertificateManagerClient(RegionEndpoint.USEast1); // 拉取所有待验证状态的证书 var listRequest = new ListCertificatesRequest { CertificateStatuses = new List<CertificateStatus> { CertificateStatus.PENDING_VALIDATION } }; var listResponse = await acmClient.ListCertificatesAsync(listRequest); foreach (var certSummary in listResponse.CertificateSummaryList) { // 拉取单个证书全量详情 var describeRequest = new DescribeCertificateRequest { CertificateArn = certSummary.CertificateArn }; var describeResponse = await acmClient.DescribeCertificateAsync(describeRequest); var certDetail = describeResponse.Certificate; // 遍历提取所有DNS验证CNAME记录 foreach (var dvOption in certDetail.DomainValidationOptions) { if (dvOption.ResourceRecord == null) continue; // 提取目标字段 string recordName = dvOption.ResourceRecord.Name; string recordValue = dvOption.ResourceRecord.Value; // 此处实现自定义存储逻辑即可 } }
常见踩坑点
- 刚提交证书创建请求的1-3秒内,AWS侧还没完成验证记录生成,此时
ResourceRecord可能为空,加个短间隔轮询即可,不需要等证书签发。 - 多域名证书、通配符域名证书会在
DomainValidationOptions中返回多条验证记录,每个需要独立验证的域名对应一条,不要只取第一条导致漏配记录。 - 跨区域调用ACM接口会拿不到对应证书,确认客户端初始化的区域和证书创建的区域一致。
内容的提问来源于stack exchange,提问作者Niv Navick
相关产品推荐
相关产品推荐

