Apache HTTPD/mod_proxy/Tomcat 和带客户端身份验证的 SSL

标签 apache tomcat ssl mod-proxy mod-proxy-balancer

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

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

我真的不想在完成以下任务时打扰其中任何一个。

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

我想为 HTTPS 请求完成的是,在没有 HTTPD 作为 SSL 端点的情况下,它们被“盲目”重定向到 Tomcat,即 HTTPD 只是将密文直接传递给 Tomcat,这样 TC 就可以继续做它已经在登录时做的事情, SSL、web.xml secret 性保证,以及最重要的客户端身份验证。

我描述的配置是否可行?

我对 webapps、SSL、HTTPS 和 Tomcat 非常熟悉,但我对 Apache HTTPD 的外部知识了解有限。

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

最佳答案

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

You can't just relay the SSL/TLS traffic to Tomcat from Apache. Either your SSL connection ends at Apache, and then you should reverse proxy the traffic to Tomcat (SSL [between Httpd and Tomcat] is rarely useful in this case), or you make the clients connect to Tomcat directly and let it handle the SSL connection.

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

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

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

甚至the options in mod_proxy_balancer 在配置的某个点期望路径。它的文档没有提到 SSL/HTTPS(“它为 HTTP、FTP 和 AJP13 协议(protocol)提供负载平衡支持”),而 mod_proxy提到 CONNECT 时至少会谈到 SSL .

我会建议几个选项:

  • 使用 iptables基于负载均衡器,不经过 Httpd,直接结束 Tomcat 中的连接。

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

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

如果您已经使用 <transport-guarantee>CONFIDENTIAL</transport-guarantee> 配置了您的网络应用程序,您需要让 Tomcat 将连接标记为安全连接,尽管它看到它们来自其普通 HTTP 端口。对于 Tomcat 5,here is an article (最初是法语,但自动翻译还不错)描述了如何实现一个阀门来设置 isSecure() . (如果您不熟悉 valves,它们类似于过滤器,但在将请求传播到 webapp 之前在 Tomcat 本身内运行。它们可以在 Catalina 中配置)我认为从 Tomcat 5.5 开始,HTTP connector secure option正是这样做的,不需要你自己的阀门。 AJP 连接器也有类似的选项(如果使用 mod_proxy_ajpmod_jk )。

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

如果你想使用mod_proxy_http , 一个技巧是通过 an HTTP header ( mod_header ) 传递证书, 使用类似 RequestHeader set X-ClientCert %{SSL_CLIENT_CERT}s 的东西.我不记得确切的细节,但重要的是要确保这个 header 被清除,这样它就永远不会来自客户端的浏览器(否则谁可以伪造它)。需要全链的可以试试this Httpd patch attempt .这种方法可能需要一个额外的阀门/过滤器才能将集管变成 javax.servlet.request.X509Certificate (通过解析 PEM block )。

其他一些可能感兴趣的点:

  • 如果我没记错的话,您需要为 Httpd 和 configure it to use them 下载明确的 CRL 文件。 .根据您使用的 Httpd 版本,您可能需要 restart it to reload the CRLs .
  • 如果您使用重新协商来获取您的客户端证书,一个 CLIENT-CERT据我所知,指令不会让 Httpd 请求客户端证书(否则,当直接使用 JSSE 连接器时,这是通过可以访问 SSLSession 的阀门完成的)。您可能需要在 Httpd 中配置匹配路径以请求客户端证书。

关于Apache HTTPD/mod_proxy/Tomcat 和带客户端身份验证的 SSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10133711/

相关文章:

linux - 我应该如何配置我的 VirtualHosts?

php - 如何获取批处理文件使用 PHP 发送电子邮件?

ssl - Nginx 不提供中间证书

php - 想要使用 PHP soap 客户端连接到 https 主机

html - IIS、ColdFusion 或 TomCat 会在大约 4MB 时切断页面输出 - 我需要帮助来确定哪个设置限制了该输出?

java - Tomcat 8.0中运行的JSP如何加载非Config文件

linux - 使用 Cloudflare 时依靠 "X-Forwarded-For"限制 Apache 中的 IP 访问是否安全?

apache - IIS7中的通配符子域。是否可以使它们像Apache中一样?

apache - 如何在 ubuntu 中启用 AllowEncodedSlashes

Tomcat 停止线程以避免潜在的内存泄漏