如何为AWS :: ElasticLoadBalancingV2 :: Listener设置多个证书

14

你好,我在为应用负载均衡监听器设置多个证书时遇到了问题。 以下是我的CF模板代码片段:

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

并且响应是: 最多可以指定'1'个证书 ARN,但是已经指定了'2'个 (服务: AmazonElasticLoadBalancingV2; 状态码:400; 错误代码:TooManyCertificates; 请求 ID: XXXXXXXXX)


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

20

编辑:感谢 @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

9

5

我来这里寻找同样的答案。发现评论/答案中没有清晰地阐述答案,所以我来补充一下。虽然您可以为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

4
注意:如果您在相同的模板中创建证书,请使用!Ref <Certificate>,否则将完整的ARN作为参数传递。请不要使用!Join构建字符串,因为这样会使代码可读性差,且容易出错。 - at0S
1
非常感谢您的评论!我在Github上看到了很多使用join构建字符串的示例模板,我认为这是一种常见的做法。很高兴听到不同的观点。您能推荐一份最佳实践指南来避免这种情况吗?还是这个特定的例子只是来自经验? - adamkgray
1
例如,!Sub "arn:aws:acm:${AWS::Region}:${AWS::AccountId}/certificate/${certificate_id}>" ,其中certificate_id作为参数传递。与双重!Join相比,更紧凑且(在我看来)更易读。我还建议在实际可以将整个arn作为参数传递时避免即时构建证书(以及任何其他真正的)arn - 这只是太费力了。就我所知,没有最佳实践,更多地是意见。 - at0S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接