我们正在将旧的java/Spring应用程序移动到AWS中,因此它位于AWS应用型负载均衡后面。Tomcat直接在端口8080上的负载均衡器后面运行,我们在负载均衡器和tomcat之间使用HTTP。
问题是在这种情况下,Spring Security模块无法识别连接是否安全。
我可以通过配置连接来解决此问题:
<Connector port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
proxyName="single-host.example.com"
secure="true"
scheme="https"
redirectPort="443"
proxyPort="443" />
它适用于单个主机名。但是,我需要它来跨多个主机名工作。
我已尝试跳过代理并添加:
server.tomcat.remote_ip_header=X-Forwarded-For
server.tomcat.protocol_header=X-Forwarded-Proto
但这似乎没什么区别。
在这种情况下是否有方法支持多个主机名?
您应该在LB上设置HTTPS连接,然后您将在LB和tomcat之间建立适当的TLS连接,以便Spring停止哭泣。您只需向LB提供一个自签名证书,并使用生成此自签名证书的私钥设置您的Spring Security模块。
(更复杂的选项:正确设置tomcat代理,强制它将LB的HTTP流封装在HTTPS流中。在代理中设置所有TLS要求:证书、私钥…)
我有一些解决程序。所以我提供了两个建议。第一个是一步一步的图片视图来解决你的问题。如果没有,那就去第二个。
第二个是使用X-Forwarded-Proto
和相关配置来解决问题。希望对您有所帮助。
亚马逊云环境的负载平衡支持过程非常简单。这里提供了一个分步教程:使用Java Web应用程序Tomcat会话粘性的弹性负载平衡(ELB)
飞利浦宇宙给出了解决方案。
在Tomcat中配置以下阀门将发出请求。isSecure()函数与X-Forwarded-Proto标头正确匹配:
<代码>
这可以添加到Tomcat的server.xml
下的
当然,在所有这些之后,有一个非常非常简单的解决方案可以从一开始就解决这个问题。真正需要做的就是修改原始通道过滤器:
if ("https".equals(invocation.getHttpRequest().getHeader("X-Forwarded-Proto"))) {
getEntryPoint().commence(invocation.getRequest(), invocation.getResponse());
}
if (invocation.getHttpRequest().isSecure() ||
"https".equals(invocation.getHttpRequest().getHeader("X-Forwarded-Proto"))) {
getEntryPoint().commence(invocation.getRequest(), invocation.getResponse());
}
此处的最终配置应为:
<bean class="org.broadleafcommerce.common.security.channel.ProtoChannelBeanPostProcessor">
<property name="channelProcessorOverrides">
<list>
<bean class="org.broadleafcommerce.common.security.channel.ProtoInsecureChannelProcessor" />
<bean class="org.broadleafcommerce.common.security.channel.ProtoSecureChannelProcessor" />
</list>
</property>
</bean>
在那之后,
有些人更喜欢在负载均衡器处终止SSL,而不是使用Apache Web服务器。在这种情况下,您通常在80/443上的LB接受流量,然后将流量路由到8080上的Tomcat。
如果您使用Spring的端口映射:
<sec:port-mappings>
<sec:port-mapping http="8080" https="443"/>
</sec:port-mappings>
这将不起作用,因为它不会覆盖新通道处理器中的端口映射。以下是一个可以正常工作的配置:
<bean class="org.broadleafcommerce.common.security.channel.ProtoChannelBeanPostProcessor">
<property name="channelProcessorOverrides">
<list>
<bean class="org.broadleafcommerce.common.security.channel.ProtoInsecureChannelProcessor" >
<property name="entryPoint">
<bean class="org.springframework.security.web.access.channel.RetryWithHttpEntryPoint">
<property name="portMapper" ref="portMapper"/>
</bean>
</property>
</bean>
<bean class="org.broadleafcommerce.common.security.channel.ProtoSecureChannelProcessor" >
<property name="entryPoint">
<bean class="org.springframework.security.web.access.channel.RetryWithHttpsEntryPoint">
<property name="portMapper" ref="portMapper"/>
</bean>
</property>
</bean>
</list>
</property>
</bean>
资源链接:HTTPS/SSL/Spring Security性在负载平衡器和非负载平衡器环境中都不起作用#424
AWS LoadBalancer在代理请求时发送X-Forwarded-Proto标头。
在Tomcat上,配置Remote teIpValve以从这些标头中解释request.secure和其他请求变量。
<Valve className="org.apache.catalina.valves.RemoteIpValve"/>
您还应该省略Connector
配置上的proxyName
设置,因为它应该自动来自阀门。
我有一个非常简单的Spring Boot应用程序,具有社交单点登录功能。 看起来是这样的: 它在应用程序中有必需的条目。yml: 它在我的本地机器上运行得很好,并且只启动了一个实例。 当有多个实例隐藏在负载平衡器后面时,就会出现问题。 即使用户在第一个请求中进行身份验证,向负载均衡器发出的后续请求也会因401而被阻止。 与第一个应用程序实例相比,请求被路由到不同的应用程序实例。 我正在试图弄清楚,
在我创建了traefik守护程序集之后,我在端口80上创建了一个作为负载均衡器的服务,这是Traefik代理端口,节点自动注册到它。如果我点击elb,我得到代理404,这是可以的,因为还没有注册服务 然后,我为web-用户界面创建了一个nodeport服务。pod内的目标端口8080和blosterip上的80。我可以从集群内部卷曲traefik用户界面,它会恢复traefikUI 然后我创建了一
我遵循文档创建基于内容的负载平衡:https://cloud.google.com/load-balancing/docs/https/content-based-example 我想通过https访问外部地址。我希望负载平衡器使用简单的http连接到VM。 这两个虚拟机都按预期工作,并且在IP地址到达时返回正确的answet。LB的设置似乎很好。两个运行状况检查均通过,并且Google SSL证
AWS推出了应用程序负载平衡器,可以进行基于路径的路由。是否可以将经典负载平衡器放在应用程序负载平衡器之后。 示例:假设我们有两个经典的负载平衡器。应用程序负载平衡器将流量路由到所有url(如应用程序负载平衡器/前端)的第一个经典负载平衡器,并将流量路由到所有url(如应用程序负载平衡器/后端)的第二个经典负载平衡器* 目前,似乎我们只能将主机置于应用程序负载平衡器之后。是否可以将负载平衡器置于应
我有一个Wordpress网站在AWS EC2实例上运行。这是通过AWS弹性负载平衡器提供的,它使用我从Amazon获得的证书启用了HTTPS。 其目的是为该网站提供http和https版本。加载http版本可以正常工作。 然而,当我加载https版本时,会出现混合内容错误,因为总是返回http链接。负载平衡器的工作方式是TLS终止于LB,并通过端口80与实际EC2实例通信。因此,实例本身上没有H
我们在Tomcat上部署了一个Grails应用程序,该应用程序部署在终止SSL的负载均衡器后面(负载均衡器然后与端口8080上的tomcat实例通信)。我们已将SpringSecurity配置为需要所有资源上的安全通道,注意来自负载均衡器的标头,强制https并从负载均衡器映射端口: 大部分工作正常-Grails中的重定向按预期使用https协议,以及大多数ajax请求。 但是,有些ajax请求无