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

时间:2012-04-13 00:26:28

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

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

我在Tomcat中运行了几个网络应用程序,例如一些页面受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外围的了解有限。

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

1 个答案:

答案 0 :(得分:7)

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

  

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

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

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

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

即使the options in mod_proxy_balancer期望在配置的某个点上有路径。它的文档没有提到SSL / HTTPS(“它提供对HTTP,FTP和AJP13协议的负载平衡支持”),而mod_proxy在提到{{1}时至少谈到SSL。 }。

我会建议几个选项:

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

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

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

如果您已使用iptables配置了webapp,则需要使Tomcat将连接标记为安全,尽管它看到它们来自其纯HTTP端口。对于Tomcat 5,here is an article(最初是法语,但自动翻译并不太糟糕)描述了如何实现阀门来设置<transport-guarantee>CONFIDENTIAL</transport-guarantee>。 (如果你不熟悉valves,它们类似于过滤器,但在请求传播到webapp之前在Tomcat本身内运行。它们可以在Catalina中配置)我想从Tomcat 5.5,{ {3}}正是如此,不需要你自己的阀门。 AJP连接器也有类似选项(如果使用isSecure()mod_proxy_ajp)。

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

如果您想使用JkOptions +ForwardSSLCertChain,则可以使用mod_proxy_http之类的内容通过proxy certificates传递证书。我不记得确切的细节,但重要的是要确保清除此标题,以便它永远不会来自客户端的浏览器(否则可能会伪造它)。如果您需要完整链,可以试用an HTTP header (mod_header)。这种方法可能需要一个额外的阀门/过滤器来将标头转换为RequestHeader set X-ClientCert %{SSL_CLIENT_CERT}s(通过解析PEM块)。

可能感兴趣的其他几点:

  • 如果我记得很清楚,您需要为Httpd和this Httpd patch attempt明确下载CRL文件。根据您使用的Httpd版本,您可能需要configure it to use them
  • 如果您正在使用重新协商来获取客户端证书,那么javax.servlet.request.X509Certificate指令将不会使Httpd请求客户端证书(据我所知,这是通过可以访问直接使用JSSE连接器时CLIENT-CERT。您可能必须在Httpd中配置匹配路径以请求客户端证书。