我一直在寻找无处不在,但无法找到以下情况的明确解决方案:
我们有一个在tomcat中运行的Web应用程序(Grails + Spring Security),位于apache后面。应用程序的部分需要在https上运行,因此使用Spring Security Channel Security时,无论何时导航到安全的应用程序的一部分,Spring都会将您重定向到具有302状态代码的https。 / p>
现在,设置tomcat以了解https和证书,因此它知道如何处理ssl。实际上,当直接通过直接访问url和端口来直接命中tomcat时,所有的工作都是100%。
当将apache放在tomcat之前时,问题就出现了。我们现在拥有的apache配置适用于应用程序的非安全部分。我们使用mod_jk来代理apache和tomcat。
但是,只要您尝试转到应用程序的安全部分,Spring就会重定向您,它会点击
<VirtualHost _default_:443> ... </VirtualHost>
apache配置的一部分......这就是问题开始的地方。
根据我的阅读,apache可以通过mod_jk将ssl处理传递给tomcat。但我们似乎无法获得正确的配置。由于已经为ssl设置了tomcat,它知道证书的位置,并且Spring Security已经设置好了,我们希望tomcat能够处理所有的ssl,而apache只是将它伪装成tomcat。
这一切都可能,或者我错过了什么?有没有人有一些明确的指示如何设置它?任何帮助将不胜感激。
我们正在使用Apache 2.2和tomat 7.0.27
由于
答案 0 :(得分:5)
您不能仅通过Apache将SSL / TLS流量中继到Tomcat。您的SSL连接在Apache处结束,然后您应该将流量反向代理到Tomcat(在这种情况下SSL很少有用),或者让客户端直接连接到Tomcat并让它处理SSL连接。
我不确定你在哪里读到mod_jk
可以将SSL连接本身传递给Tomcat。它需要直接中继套接字,因此绕过mod_jk
使用的AJP协议(顺便说一句mod_proxy_ajp
是新的方式,甚至是mod_proxy_http
)。
如果您希望Tomcat无论如何都要处理SSL请求,我不确定为什么您希望Apache在Tomcat之前。如果这与端口号或其他内容有关,请使用防火墙规则将端口443转发到Tomcat端口。
此外,请谨慎对待从HTTP到HTTPS的自动重定向的方式:they only happen after the initial HTTP request has been made。
答案 1 :(得分:0)
从你的帖子中,我无法判断你是否遇到问题,同时让ssl在Apache上工作,或者是否因为你的某些应用程序是通过http进行的,所以Apache永远不会重定向到ssl。请注意,它完全可以在ssl上有多个“段”(意思是用户 - &gt; Apache over ssl和Apache - &gt; tomcat over ssl)。
1.如果问题是让ssl在Apache上工作 - 你需要确保在Apache端正确设置了ssl。
2.如果问题是“重定向”,请尝试为http和https保留单独的URL。喜欢/something.mysite.com/non_ssl/和/something.mysite.com/ssl/。这样可以更容易地在Apache中编写规则。