繁体   English   中英

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

[英]Apache HTTPD/mod_proxy/Tomcat and SSL with client auth

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

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

在完成下面的任务时,我真的不想打扰任何一个。

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

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

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

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

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

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

您不能仅通过Apache将SSL / TLS流量中继到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时至少谈到了SSL。

我会建议几个选项:

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

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

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

如果已使用<transport-guarantee>CONFIDENTIAL</transport-guarantee>配置了webapp,则需要使Tomcat将连接标记为安全,尽管它看到它们来自其纯HTTP端口。 对于Tomcat 5, 这里有一篇文章 (最初是法语,但自动翻译并不算太糟糕),描述了如何实现一个阀来设置isSecure() (如果您不熟悉阀门 ,它们类似于过滤器,但在请求传播到webapp之前在Tomcat本身内运行。它们可以在Catalina中配置)我认为从Tomcat 5.5, HTTP连接器secure选项可以确切地说,不需要你自己的阀门。 AJP连接器也有类似的选项(如果使用mod_proxy_ajpmod_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请求客户端证书(否则通过可以在使用JSSE时访问SSLSession的阀门完成连接器直接)。 您可能必须在Httpd中配置匹配路径以请求客户端证书。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM