【问题标题】:CloudFormation AWS::CertificateManager::Certificate automated certificate validationCloudFormation AWS::CertificateManager::Certificate 自动证书验证
【发布时间】:2020-11-06 06:50:13
【问题描述】:

根据 herehere 的 AWS 文档,我应该能够使用 cloudformation 自动创建证书和验证。显然,当您在 DomainValidationOptions 中指定 HostedZoneId 时,它应该创建所需的 DNS 记录以完成验证(至少从非常模糊的文档中看起来是这样)。我的证书 CF 模板如下所示:

Resources:
  MyAPICert:
    Type: AWS::CertificateManager::Certificate
    Properties:
      DomainName: xxxx.dev.mydomain.io
      DomainValidationOptions:
        - DomainName: mydomain.io
          HostedZoneId: /hostedzone/Z03XXXXXXXXXXXX
      ValidationMethod: DNS

“mydomain.io”(当然更改了)是使用 AWS 作为注册商注册的,因为文件说必须是自动验证才能工作的情况。

上面的这个模板作为资源包含在 serverless.yml 中。但是,当我部署时,堆栈创建只是卡在等待 DNS 记录 - 即它没有添加所需的 CNAME 条目,因为我理解它是 supposed 做的,因此堆栈被卡住了。

有人用这个功能吗?

而且,是的,我知道尝试做同样事情的第 3 方自定义资源,如果 CF 现在应该在本地执行此操作,我不想使用它们。

【问题讨论】:

  • 我开始怀疑 HostedZoneId 是否应该没有 /hostedzone/ 前缀,这是我从输出 aws route53 list-hosted-zones 得到的:{ "HostedZones": [ { "Id": "/hostedzone/Z03XXXXXXXXXXXX", "Name": "mydomain.io.", }
  • Hmm..nope...即使我省略了 /hostedzone/ 前缀,它的行为也是一样的。

标签: amazon-web-services ssl amazon-cloudformation serverless-framework amazon-route53


【解决方案1】:

我遇到了同样的问题。您需要在DomainValidationOptionsDomainName参数中指定包含主机的完整域名,并且只需指定托管区域id:

Resources:
  MyAPICert:
    Type: AWS::CertificateManager::Certificate
    Properties:
      DomainName: xxxx.dev.mydomain.io
      DomainValidationOptions:
       - DomainName: xxxx.dev.mydomain.io
         HostedZoneId: Z03XXXXXXXXXXXX
      ValidationMethod: DNS

在我的测试中,Route53 验证记录是在堆栈运行大约一分钟后添加的,并且域在大约 15 分钟后成功验证了它。

【讨论】:

  • 天哪,就是这样!如果该细节记录在某处,那就太好了!感谢您,它现在记录在“非官方”文档中,供遇到相同问题的任何人使用。
  • 在 DomainValidationOption 文档的 HostedZoneId 属性下有一个 note,内容如下:“ListHostedZones API 返回格式为'/hostedzone/Z111111QQQQQQQ'的 ID,但 CloudFormation 要求 ID 在格式'Z111111QQQQQQQ'"。
  • 它有效!也请留意您的电子邮件以获取更改授权
【解决方案2】:

如果这长时间卡在进行中,则可能是您在需要使用公共托管区域时使用了私有托管区域。可能您不使用私有 CA。 这个过程应该需要 2-3 分钟,不会超过这个时间。

【讨论】:

    【解决方案3】:

    我刚刚将以下模板部署到 CloudFormation,它成功创建了验证 DNS 记录并授权了证书。

    如果您要传递参数SiteDnsZoneName=mydomain.io.SiteDnsZoneId=ABCDEFGHIJKLMNOPQRSTU,它将创建一个涵盖mydomain.io*.mydomain.io 的SAN 证书

    {
        "Description": "Deploy wildcard SAN cert inc bare domain. (Must deploy cert to us-east-1 for CloudFront)",
        "Parameters": {
            "SiteDnsZoneName": {
                "Type": "String",
                "MinLength": 4,
                "Description": "DNS Zone",
                "Default": "example.com"
            },
            "SiteDnsZoneId": {
                "Type": "String",
                "MinLength": 8,
                "Description": "DNS Zone Id",
                "Default": "ABCDEFGHIJKLMNOPQRSTU"
            }
        },
        "Resources": {
            "SiteCertificate": {
                "Type": "AWS::CertificateManager::Certificate",
                "Properties": {
                    "DomainName": {
                        "Fn::Join": [
                            ".",
                            [
                                "*",
                                {
                                    "Ref": "SiteDnsZoneName"
                                }
                            ]
                        ]
                    },
                    "SubjectAlternativeNames": [
                        {
                            "Ref": "SiteDnsZoneName"
                        }
                    ],
                    "DomainValidationOptions": [
                        {
                            "DomainName": {
                                "Ref": "SiteDnsZoneName"
                            },
                            "HostedZoneId": {
                                "Ref": "SiteDnsZoneId"
                            }
                        }
                    ],
                    "ValidationMethod": "DNS"
                }
            }
        }
    }
    

    注意:如果您想在 CloudFront 中使用证书,您必须在 us-east-1 中部署该证书。

    注意 2:Route53 需要托管您的 DNS 区域,但不需要 AWS 是注册商。您的域可以向任何提供商注册,只要您在添加区域时使用 Route53 提供的 AWS 名称服务器。

    【讨论】:

    • 创建 CNAME 记录需要多长时间?我等了长达 30 分钟,没有出现 CNAME 条目(堆栈中也没有错误)。
    • 上述堆栈需要 6 或 7 分钟才能部署(创建 CNAME 并创建/激活证书)。如果让它超时,它会给出什么输出/错误?您在哪个区域部署?
    • 它永远不会超时,我可以尝试一下,然后让它过夜。在日志中,有输出说明需要将什么放入 DNS,但堆栈中没有任何内容表明它正在执行此操作(实际上它没有执行此操作)。部署到 us-east-2。
    • 您能否将所有内容部署到 us-east-1,或者仅将证书部署到 us-east-1 并为您的 us-east-2 应用程序使用 us-east-1 证书 ARN?它很奇怪,它没有出错 - 但我怀疑它是由于地区造成的。
    • 完全按照上面的方式配置,但直到我将 DomainValidationOptions 下的 DomainName 属性更改为与@X-Guardian 在答案中建议的证书属性下的 DomainName 属性相同(我知道,这确实没有意义,因为我也在使用通配符域)。当我这样做时,CFN 开始自动创建 CNAME 记录。但是,堆栈模板仍然在那里等待验证证书。尽管正确添加了 CNAME 记录,证书管理器也会显示“等待验证”。
    猜你喜欢
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 2018-06-10
    相关资源
    最近更新 更多