AWS Elastic Load Balancer 将环境标记为红色,因为 EC 实例上启用了 TLS

AWS Elastic Load Balancer 将环境标记为红色,因为 EC 实例上启用了 TLS

我们正在使用带有应用程序类型负载均衡器的 AWS Elastic Beanstalk 来部署 .NET 应用程序。

一开始,我们在负载均衡器级别使用通配符证书。实际的 EC 实例和其上的 IIS 不处理 TLS 流量,因为负载均衡器将连接剥离为非 TLS。一切都很好。但是,后来我们需要在实例上安装 SSO(服务提供商)工具,而此工具需要 TLS。除了负载均衡器上的证书之外,我们最终在 EC 实例级别创建了 Lets Encrypt 证书。

最终发生的事情是,AWS 一直将我们的所有实例标记为“红色”,因为负载均衡器不断尝试请求http://本地主机:443(或者http://IP:443) 并且这些都不会再回来了。

我尝试在 EC 实例上使用绑定到本地主机的自签名证书,但这不起作用,因为(我认为)LB 必须信任该证书才能收到 200 回复。

如何处理这种情况?

答案1

你需要配置您的健康检查以使用 HTTPS 协议。查看您的目标组(即 )时us-east-1,浏览到此 URL,或根据您的区域进行修改:https://console.aws.amazon.com/ec2/v2/home?region=us-east-1#TargetGroups:sort=targetGroupName),选择目标群体并选择操作 > 编辑健康检查。对于健康检查,请将设置ProtocolHTTPS然后点击节省

在此处输入图片描述

由于您的 ELB 正在监听 443,因此您可以将Port选项设置为交通港

这应该将健康检查请求发送给https://ip.of.your.ec2:443

更新 1: 在评论中提出更多问题后,我对此设置进行了进一步的研究。以下是我的发现。

如果后端目标和 ALB 节点位于同一 VPC 中,则在线路级别,所有客户数据包都包装在专有 VPC 封装协议中。此封装协议可识别各种 SDN 参数,包括源和目标弹性网络接口。对于每个数据包,这些参数在发送方和接收方都进行双向验证。此外,参数的元数据由内部 EC2 控制平面作为启动实例的一部分安全地提供,并直接集成在安全硬件中。这种总体设计是为了确保在 VPC 网络内不存在未经授权的数据包发送或接收的风险,也不存在数据包被中介拦截的风险。

参考: https://forums.aws.amazon.com/thread.jspa?threadID=263914

那么上面的引用有一个链接到此官方 AWS 文档用于将后端实例身份验证添加到传统负载均衡器。然而,命令行界面或者API文档提到这仅适用于 Classic Load Balancer。因此,我假设这将适用于应用程序负载均衡器

回到上面的引文,似乎手动指定要使用的证书create-load-balancer-policy不应该是必需的,除非您的 ALB 和 EC2 目标不在同一个 VPC 中。

因此,您可以尝试使用 Lets Encrypt 证书添加负载均衡器策略。

但等一下,还有更多! 我质疑为什么您必须让实际服务器通过 HTTPS 提供内容才能实现您的 SSO SP。它是在同一台服务器上运行的两个应用程序之间执行 SSO 吗?还是仅仅允许您的应用程序成为外部 IdP 的 SP?如果是后者,您的所有 EC2 实例是否都配置为同一个 SP,还是它们有自己独特的配置?如果是唯一的,您如何将响应传递给正确的目标?由于这个限制,我不得不假设它们都配置相同。那么,为什么与您的 ALB 建立 TLS 连接还不够?您是否使用 Lets Encrypt 证书加密 SAML 断言,并且还使用同一证书直接从您的实例提供 HTTPS 流量?如果是这样,那么我相信可以重建它以不需要在实例上配置 HTTPS。在将数据发送回最终用户之前,将使用您配置的证书在服务器上加密断言。IdP 需要知道该证书的公钥,以便它可以解密断言并验证它来自有效来源。所有这些设置都不需要实际的 EC2 来监听 443。

相关内容