我们正在使用带有应用程序类型负载均衡器的 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),选择目标群体并选择操作 > 编辑健康检查。对于健康检查,请将设置Protocol
为HTTPS然后点击节省。
由于您的 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。