【问题标题】:How to set multiple certificates for AWS::ElasticLoadBalancingV2::Listener如何为 AWS::ElasticLoadBalancingV2::Listener 设置多个证书
【发布时间】:2023-03-24 04:50:01
【问题描述】:

您好,我在为 ALB 侦听器设置多个证书时遇到问题。 这是我的 CF 模板的片段:

  DiscoveryListenerHTTPS:
    Type: AWS::ElasticLoadBalancingV2::Listener
    DependsOn:
      - DiscoveryLoadBalancer
      - DiscoveryLoadBalancerTargetGroup
    Properties:
      Certificates:
       - CertificateArn: !Ref CertificateArn1
       - CertificateArn: !Ref CertificateArn2

并且响应是: Up to '1' certificate ARNs can be specified, but '2' were specified (Service: AmazonElasticLoadBalancingV2; Status Code: 400; Error Code: TooManyCertificates; Request ID: XXXXXXXXX)

【问题讨论】:

  • 文档指出:如果您为协议属性指定 HTTPS 或 TLS,则必须仅指定一个证书。您的模板中没有包含协议,但它是必填字段,所以我不确定为什么它不存在。
  • @jarmod, 1) 您可以添加许多证书,但不能直接添加 Listener 资源,而应使用 ListenerCertificate 资源。参看。回答如下。 2)我认为为了简单起见,删除了缺少的协议和端口。

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


【解决方案1】:

有点笨拙;用于创建侦听器的 CF 模板仅设置默认证书。

您应该能够使用此对象向侦听器添加其他证书: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-listenercertificate.html

【讨论】:

    【解决方案2】:

    来到这里寻找相同的答案。发现 cmets/answers 中没有明确列出答案,所以我会这样做。虽然您可以为 HTTPS 侦听器指定多个 SSL 证书,但您不能直接在 CFN 模板中为 HTTPS 侦听器资源指定多个证书。您必须在模板中为其他证书创建另一个资源,如下所示:

    AdditionalListenerCertificates:
            Type: AWS::ElasticLoadBalancingV2::ListenerCertificate
            Properties:
                Certificates:
                  - CertificateArn: !Join
                    - ":"
                    - - "arn:aws:acm"
                      - !Ref AWS::Region
                      - !Ref AWS::AccountId
                      - !Join ["/", ["certificate", "<you-certificate-id>"]]
                ListenerArn: !Ref HTTPSListener
    

    【讨论】:

    • 请注意 - 如果您在同一模板中创建证书,只需使用 !Ref &lt;Certificate&gt;,否则将完整的 arn 作为参数传递。请看在上帝的份上,不要用!Join 构建字符串,因为它读起来很糟糕,而且更糟。
    • 非常感谢您的评论!我在 github 上看到了很多使用 join 构建字符串的示例模板,我认为这是常见的做法。很高兴听到反对意见。是否有您可以推荐的最佳实践指南来避免此类事情,或者这个特定示例只是来自经验?
    • 例如!Sub "arn:aws:acm:${AWS::Region}:${AWS::AccountId}/certificate/${certificate_id}&gt;" ,其中certificate_id作为参数传递。与双 !Join 相比,更紧凑且(恕我直言)可读性更强。当您实际上可以将整个arn 作为参数传递时,我还建议避免即时构建证书(以及任何真正的证书)arn - 太费力了。没有最佳实践,AFAIK 本身,把它当作意见。
    【解决方案3】:

    编辑:感谢@chris-pollard 和@adamkgray 的回答,改进了答案

    这对我有用,您可以为 HTTPS 侦听器指定多个 SSL 证书。

    对于 HTTPS,您不能在 AWS::ElasticLoadBalancingV2::Listener 资源上直接指定多个证书。 相反,您必须在模板中创建一个 AWS::ElasticLoadBalancingV2::ListenerCertificate 资源以获取其他证书。

    这是一个使用默认证书的 443 端口监听器示例,然后是一个证书列表,其中包含至少一个证书并与之前创建的监听器相关联:

    Listener443:
        DependsOn:
        - LoadBalancer
        Type: AWS::ElasticLoadBalancingV2::Listener
        Properties:
          Certificates:
            - CertificateArn: !Ref CertificateARN
          LoadBalancerArn: !Ref LoadBalancer
          DefaultActions:
            - Type: fixed-response
              FixedResponseConfig:        
                ContentType: text/plain
                MessageBody: "Not Found"
                StatusCode: 404
          Port: 443
          Protocol: HTTPS
    
      CertificatesList:
        Type: AWS::ElasticLoadBalancingV2::ListenerCertificate
        Properties: 
          Certificates: 
            - CertificateArn: !Ref CertificateARN2
          ListenerArn: !Ref Listener443
    

    【讨论】:

      猜你喜欢
      • 2018-06-10
      • 2019-03-29
      • 2022-06-17
      • 2013-09-24
      • 2016-08-18
      • 2014-04-25
      • 2011-01-15
      • 2021-03-04
      • 2020-05-09
      相关资源
      最近更新 更多