Apache 背后的 Tomcat:将 SSL 与 j_security_check 结合使用

Posted

技术标签:

【中文标题】Apache 背后的 Tomcat:将 SSL 与 j_security_check 结合使用【英文标题】:Tomcat behind Apache: Using SSL with j_security_check 【发布时间】:2010-11-30 08:19:51 【问题描述】:

我在 Apache 后面的 Tomcat 上使用 SSL 有一点问题。我整个上午都在使用谷歌试图找到一个好的解决方案,但到目前为止还没有。

作为我的 SSL VirtualHost 配置的一部分,我有

<Location /MyApp/>
  ProxyPass http://localhost:8080/MyApp/
</Location>

这在大多数情况下都可以正常工作,但是 j_security_check 在从 https://mysite.com/MyApp 成功登录后,会重定向到 HTTP 页面 http://mysite.com/MyApp/secret.html,而不是将其保留为 HTTPS 页面 https://mysite.com/MyApp/secret.html。不仅登录是机密的,还有正在传输的数据,所以我需要保持 HTTPS。当我添加到应用程序的安全约束时

<user-data-constraint>
  <transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>

它重定向到https://mysite.com:8443/MyApp/secret.html。我意识到它重定向到 8443 因为 server.xml 已将 SSL 配置为 8443,但由于这是通过 Apache 代理的,它实际上应该是 443。

我意识到我没有 ProxyPassReverse,但这不是我可以在 Apache 配置文件的一部分中添加的内容

如何强制 j_security_check 重定向相对(所以不要将 https 更改为 http)或重定向到 443 而不是 8443?这是我应该通过 Tomcat 或 Apache 的 mod_proxy 强制执行的吗?

干杯

尼克

【问题讨论】:

【参考方案1】:

您不能真正指望 Tomcat 为您的设置重定向到 SSL。您需要编写一个过滤器来自己进行重定向。

对于您的特定设置,如果您像这样添加重定向端口,它可能会起作用,

<Connector ... port="8080" redirectPort="443"/>

请移除 HTTPS 连接器。当您同时拥有 redirectPort 和 HTTPS 连接器时,它可能会混淆某些版本的 Tomcat。听起来您无论如何都不希望人们访问您的 HTTPS 端口。

这仅在您在同一台机器上安装 Apache 和 Tomcat 时有效。在生产环境中,情况可能并非如此。

【讨论】:

谢谢,我会看看过滤器:-)

以上是关于Apache 背后的 Tomcat:将 SSL 与 j_security_check 结合使用的主要内容,如果未能解决你的问题,请参考以下文章

如何将 SSL 从 Tomcat 迁移到 Apache HTTPD?

与远程服务器进行 SSL 握手期间出错

apache与tomcat负载集群集成方法配置

在端口 80 上为 Tomcat 和在 8080 上的 Apache 使用相同的 SSL 证书

在 tomcat 和 apache http 服务器之间配置 SSL

在 Apache SSL 代理后面嵌入 Tomcat 的 Spring Boot