6

我确定这是一个常见问题解答,但我找不到任何我认为是同一个问题的东西。

我有几个在 Tomcat 中运行的 Web 应用程序,其中一些页面例如受 SSL 保护的登录页面,由其 web.xmls 中的机密性元素定义。其中一个应用程序还通过证书接受客户端身份验证。我还有一个相当广泛的基于 JAAS 的授权和身份验证方案,并且在各种 webapps 之间有各种共享代码和不同的 JAAS 配置等。

在完成以下任务时,我真的不想打扰任何这些。

在添加更多 Tomcat 实例之前,我现在正在将带有 mod-proxy 和 mod-proxy-balancer 的 Apache HTTPD 作为负载均衡器插入到 Tomcat 前面。

我想要为 HTTPS 请求完成的是,它们被“盲目”重定向到 Tomcat,而 HTTPD 不是 SSL 端点,即 HTTPD 只是将密文直接传递给 Tomcat,以便 TC 可以继续做它已经在做的登录、SSL、Web .xml 机密性保证,最重要的是客户端身份验证。

这可能与我描述的配置有关吗?

我对 webapps 和 SSL 以及 HTTPS 和 Tomcat 非常熟悉,但是我对 Apache HTTPD 的外围知识是有限的。

如有必要,很高兴移动它,但它是一种使用配置文件进行编程;)

4

1 回答 1

7

这听起来类似于这个问题,我已经回答说这是不可能的:

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

我承认支持这一说法的链接有点少。我想我可能是错的(我只是从未见过这样做,但这并不严格意味着它不存在......)。

如您所知,您需要在用户代理和 SSL 端点之间建立直接连接或完全中继的连接(在这种情况下,您希望它是 Tomcat)。这意味着 Apache Httpd 将无法查看 URL:它最多只能知道主机名(当使用服务器名称指示时)。

mod_proxy文档中似乎不依赖于 URL 的唯一选项是AllowCONNECT,它用于 HTTPS 的转发代理服务器。

即使是在配置的某个点上的选项mod_proxy_balancer也需要一条路径。它的文档没有提到 SSL/HTTPS(“它为 HTTP、FTP 和 AJP13 协议提供负载平衡支持”),而mod_proxy在提到CONNECT.

我会建议几个选项:

  • 使用iptables基于 -based 的负载均衡器,无需通过 Httpd,直接结束 Tomcat 中的连接。

  • 在 Httpd 结束 SSL/TLS 连接并使用普通的 HTTP 反向代理到 Tomcat。

第二个选项需要更多配置来处理客户端证书和 Tomcat 的安全约束。

如果您已经使用 配置了您的 webapp <transport-guarantee>CONFIDENTIAL</transport-guarantee>,您将需要让 Tomcat 将连接标记为安全,尽管事实上它认为它们来自其纯 HTTP 端口。对于 Tomcat 5,这里有一篇文章(原文为法语,但自动翻译还不错)描述了如何实现一个 Valve 来设置isSecure(). (如果您不熟悉Valve,它们类似于过滤器,但在请求传播到 webapp 之前在 Tomcat 本身内运行。它们可以在 Catalina 中配置)我认为从 Tomcat 5.5 开始,HTTP 连接器secure选项完全可以那,不需要你自己的阀门。AJP 连接器也有一个类似的选项(如果使用mod_proxy_ajpor mod_jk)。

如果使用 AJP 连接器,mod_proxy_ajp将转发链中的第一个证书并使其在 Tomcat 中可用(通过正常的请求属性)。你可能需要SSLOptions +ExportCertData +StdEnvVars. mod_jk(尽管据我所知已弃用)也可以转发客户端发送的整个链(使用JkOptions +ForwardSSLCertChain)。这在使用代理证书时可能是必要的(如果没有链接到它们的最终实体证书,这将毫无意义)。

如果您想使用mod_proxy_http,一个技巧是通过HTTP 标头 ( mod_header)传递证书,使用类似RequestHeader set X-ClientCert %{SSL_CLIENT_CERT}s. 我不记得确切的细节,但重要的是确保清除此标头,以便它永远不会来自客户端的浏览器(否则谁可以伪造它)。如果你需要完整的链,你可以试试这个 Httpd 补丁尝试。这种方法可能需要一个额外的阀门/过滤器来将标题变成javax.servlet.request.X509Certificate(通过解析 PEM 块)。

可能感兴趣的其他几点:

  • 如果我没记错的话,您需要为 Httpd 显式下载 CRL 文件并将其配置为使用它们。根据您使用的 Httpd 版本,您可能需要重新启动它才能重新加载 CRL
  • 如果您使用重新协商来获取您的客户CLIENT-CERT端证书,据我所知,指令不会使 Httpd 请求客户端证书(否则,这是通过一个可以在SSLSession直接使用 JSSE 连接器时访问的阀门来完成的)。您可能必须在 Httpd 中配置匹配路径以请求客户端证书。
于 2012-04-13T02:22:54.160 回答