spring - AWS ALB - 安全 Web 套接字 + Spring Boot
问题描述
环境设置:
我在 AWS ALB(应用程序负载均衡器)后面有一个 Spring Boot 应用程序。ALB 被配置为以 Spring 引导应用程序作为在 HTTP 上运行的目标将 HTTPs 发送到世界。
连接图:
HTTPS 443 -> ALB -> HTTP 8080 -> Spring Boot
问题:
由于应用程序在 HTTP 内部(8080)上运行,但通过负载均衡器在 HTTPs 上提供服务,由于浏览器中的混合内容限制,我无法使用 ws://example.com 协议 t。我也不能使用“wss://example.com”,因为通过 HTTP 运行的终端服务器(Spring Boot)不接受连接。
问题:
我找到的唯一解决方案是将最终应用程序移动到使用带有自签名证书的 HTTPs。是否有替代解决方案从而使应用程序在 HTTP 上运行但接受 WSS 连接?
解决方案
将负载均衡器配置为将 HTTPS 流量转发到 HTTP 对 websocket 不起作用。相反,您必须将其配置为将 SSL(安全 TCP)转发到 TCP。这将适用于 HTTP/HTTPS 流量,因为 HTTP 是基于 TCP 的协议,而 HTTPS 是带有 TLS 的 HTTP,它将允许 websocket 流量通过。
将 ELB 配置为使用代理协议。使用 AWS CLI。
首先,创建新策略:
aws elb create-load-balancer-policy \ --load-balancer-name $ALB_NAME
--policy-name $ALB_NAME-proxy-protocol \ --policy-type-name ProxyProtocolPolicyType \ --policy-attributes AttributeName=ProxyProtocol,AttributeValue =真
其次,将其附加到负载均衡器。为实例正在侦听的每个端口运行一次:
aws elb set-load-balancer-policies-for-backend-server
--load-balancer-name $ALB_NAME \ --instance-port 8080 \ --policy-names $ALB_NAME-proxy-protocol