如何为 AWS::ElasticLoadBalancingV2::Listener 设置多个证书
Posted
技术标签:
【中文标题】如何为 AWS::ElasticLoadBalancingV2::Listener 设置多个证书【英文标题】:How to set multiple certificates for AWS::ElasticLoadBalancingV2::Listener 【发布时间】:2019-06-24 03:03:03 【问题描述】:您好,我在为 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)我认为为了简单起见,删除了缺少的协议和端口。 【参考方案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 <Certificate>
,否则将完整的 arn 作为参数传递。请看在上帝的份上,不要用!Join
构建字符串,因为它读起来很糟糕,而且更糟。
非常感谢您的评论!我在 github 上看到了很多使用 join 构建字符串的示例模板,我认为这是常见的做法。很高兴听到反对意见。是否有您可以推荐的最佳实践指南来避免此类事情,或者这个特定示例只是来自经验?
例如!Sub "arn:aws:acm:$AWS::Region:$AWS::AccountId/certificate/$certificate_id>"
,其中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
【讨论】:
以上是关于如何为 AWS::ElasticLoadBalancingV2::Listener 设置多个证书的主要内容,如果未能解决你的问题,请参考以下文章
如何为 RecyclerView 设置 onItemClickListener? [复制]