9

我一直在到处寻找,但找不到针对以下情况的明确解决方案:

我们有一个 web 应用程序(Grails + Spring Security)在 apache 后面的 tomcat 中运行。部分应用程序需要在 https 上运行,因此使用 Spring Security Channel Security,每当您导航到应用程序的安全部分时,Spring 都会使用 302 状态代码将您重定向到 https。

现在,tomcat 设置为了解 https 和证书,因此它知道如何处理 ssl。事实上,当通过直接访问 url 和端口直接访问 tomcat 来绕过 apache 时,一切正常 100%。

现在将apache放在tomcat前面时出现了问题。我们目前拥有的 apache 配置适用于应用程序的非安全部分。我们正在使用 mod_jk 代理 apache 和 tomcat。

但是,一旦您尝试转到应用程序的安全部分,Spring 就会重定向您,它会命中

<VirtualHost _default_:443> ... </VirtualHost>

apache配置的一部分......这就是问题的开始。

根据我的阅读,apache 可以通过 mod_jk 将 ssl 处理传递给 tomcat。但我们似乎无法获得正确的配置。由于 tomcat 已经为 ssl 设置好了,它知道证书在哪里,并且 Spring Security 设置好了,我们希望 tomcat 处理所有的 ssl,而 apache 只是将它典当给 tomcat。

这是可能的,还是我错过了什么?有人对如何设置有明确的说明吗?任何帮助将不胜感激。

我们正在使用 Apache 2.2 和 tomat 7.0.27

谢谢

4

2 回答 2

5

您不能只将 SSL/TLS 流量从 Apache 中继到 Tomcat。要么您的 SSL 连接在 Apache 结束,然后您应该将流量反向代理到 Tomcat(SSL 在这种情况下很少有用),或者您让客户端直接连接到 Tomcat 并让它处理 SSL 连接。

我不确定您在哪里读到mod_jk可以将 SSL 连接本身传递给 Tomcat。它需要直接中继套接字,因此绕过了使用的 AJP 协议mod_jk(​​顺便说一下,这mod_proxy_ajp是新的方式,甚至是mod_proxy_http)。

如果您希望 Tomcat 处理 SSL 请求,我不确定您为什么希望 Apache 位于 Tomcat 前面。如果这与端口号或其他内容有关,请使用防火墙规则将端口 443 转发到 Tomcat 端口。

此外,请注意这些从 HTTP 到 HTTPS 的自动重定向的完成方式:它们仅在发出初始 HTTP 请求之后发生

于 2012-04-06T13:19:05.953 回答
0

从您的帖子中,我无法判断您是否在让 ssl 在 Apache 上工作时遇到问题,或者由于您的应用程序的某些部分是通过 http 进行的,因此 Apache 永远不会通过 ssl 重定向。请注意,在 ssl 上拥有多个“段”是完全可以的(意味着用户 -> Apache over ssl 和 Apache -> tomcat over ssl)。
1. 如果问题是让 ssl 在 Apache 上运行 - 您需要确保在 Apache 端正确设置了 ssl。
2. 如果问题是“重定向”,请尝试为 http 和 https 保留单独的 url。像 /something.mysite.com/non_ssl/ 和 /something.mysite.com/ssl/。这将使在 Apache 中编写规则变得更加容易。

于 2012-04-06T21:02:16.463 回答