【问题标题】:How to attach pre-uploaded SSL cert to ELB in CloudFormation template?如何在 CloudFormation 模板中将预上传的 SSL 证书附加到 ELB?
【发布时间】:2013-02-11 01:29:33
【问题描述】:

我一直在尝试在新的 Cloud Formation 模板上附加我当前用于我的 Elastic Load Balancing 实例之一的 SSL 证书,但每次我得到:
找不到服务器证书钥匙
然后 Cloudformation 模板在该点开始回滚。

            "Listeners" : [ 
         {
          "LoadBalancerPort" : "443",
          "InstancePort" : "80",
          "SSLCertificateId" : "start_certname_com",
          "Protocol" : "HTTPS"
         },...

亚马逊要求 使用 SSL 证书的 ARN。 我相信这是正确的,因为这是当前设置 ELB 的下拉列表中出现的确切字符串,需要 443到实例上的端口 80。

我的 Listener 是否遗漏了什么?

【问题讨论】:

    标签: ssl amazon-web-services portforwarding amazon-cloudformation


    【解决方案1】:

    您可以仅使用证书名称为 CloudFormation 中的证书派生 ARN。无需运行命令行工具并将值硬编码到 CloudFormation 模板中。

        "Parameters":{
          "Path":{
             "Description":"AWS Path",
             "Default":"/",
             "Type":"String"
          }
        }
         ...
            "Listeners" : [ 
         {
          "LoadBalancerPort" : "443",
          "InstancePort" : "80",
          "SSLCertificateId" : {
            "Fn::Join":[
               "",
               [
                  "arn:aws:iam::",
                  {
                     "Ref":"AWS::AccountId"
                  },
                  ":server-certificate",
                  {
                     "Ref":"Path"
                  },
                  "start_certname_com"
               ]
            ]
          },
          "Protocol" : "HTTPS"
         },...
    

    这将确定您的帐户 ID 与 {"Ref":"AWS::AccountId"} pseudo parametercombines 它与形成 ARN 所需的其他元素。请注意,如果您为证书设置了路径,我将使用一个名为 Path 的变量。如果不是“/”的默认值,则可以正常工作。

    @Tristan 提到了这个解决方案,它是merrix143243's solution 的扩展

    【讨论】:

    • 绝对是最佳答案!
    • 非常酷!如果有人使用cloudformation-ruby-dsl,这里有一个受此答案启发的单行::SSLCertificateId => join('', 'arn:aws:iam::', aws_account_id(), ':server-certificate/', ref('SSLCertificateName'))
    • @gene_wood 答案适合亚马逊颁发的证书,但可能不适合我(从其他证书颁发机构)导入的证书。导入的被分配一个 GUID,在 ACM(亚马逊证书管理)的“标识符”字段中可见。此外,在 2018 年 3 月,1)“arn:aws:acm::”似乎不是前缀“:iam::”,2)“:server-certificate”看起来像“:certificate”(除非我导入错了)。问题:您的“start_certname_com”对应ACM中的哪个字段:“域名”、“附加名称”、“标识符”、“名称”(用户标签)?
    【解决方案2】:

    其实我在等待答案的时候已经想好了怎么做,需要使用amazon提供的IAM CLI工具,然后使用命令
    iam-servercertgetattributes -s certname

    这将为您提供如下字符串:

    arn:aws:iam::123456789123:server-certificate/start_certname_com

    这是您在“SSLCertificateId”值对字段中放置的值

    IAM 命令行工具 (CLI) 的设置说明可在以下位置找到:
    http://docs.aws.amazon.com/IAM/latest/CLIReference/Setup.html

    在此处从 aws 下载工具包
    http://aws.amazon.com/developertools/AWS-Identity-and-Access-Management/4143

    总而言之,您的最终块将如下所示:

     "Listeners" : [ 
        {  
          "LoadBalancerPort" : "443",  
          "InstancePort" : "80",  
          "SSLCertificateId" : "arn:aws:iam::123456789123:server-certificate/start_certname_com",  
          "Protocol" : "HTTPS"  
         },...  
    

    【讨论】:

    • 很好的后续回答 - 帮助很大。
    • 也可以直接在云形成中进行此查找。见forums.aws.amazon.com/message.jspa?messageID=248285
    • 特里斯坦的答案在下面的答案中得到了@gene_wood 的充分解释。
    • 我正在使用Troposphere创建cloudformation堆栈,Listener = t.add_resource(elb.Listener( "Listener", Certificates=elb.Certificate( CertificateArn="", ), Port="443", Protocol="HTTPS", LoadBalancerArn=Ref(ApplicationLoadBalancer), SslPolicy="ELBSecurityPolicy-TLS-1-2-Ext-2018-06", DefaultActions=[elb.Action( Type="forward", TargetGroupArn=Ref(TargetGroupApp) )] ))certificatearn需要添加什么
    【解决方案3】:

    以下是使用最新 AWS CLI 获取长证书名称的方法:

    pip install awscli
    aws iam list-server-certificates
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-18
      • 2017-12-11
      • 2015-01-06
      • 1970-01-01
      • 2012-10-10
      • 2018-03-10
      • 2014-07-08
      相关资源
      最近更新 更多