我确信这是一个常见问题,但我找不到任何我认为是同一个问题的东西。
我有几个网络应用程序运行在Tomcat中,有一些页面,例如登录页面由SSL保护,在他们的web.xmls中定义了机密性元素。其中一个应用程序还通过证书接受客户端身份验证。我还有一个相当广泛的基于JAAS的授权和认证方案,并且在不同的the应用程序之间有各种共享代码和不同的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的了解有限。
如果有必要,我很乐意将其移动,但这是一种使用配置文件的编程;)
发布于 2012-04-13 10:22:54
这听起来类似于this question,我回答说这是不可能的:
Tomcat你不能只是中继
/TLS流量从Apache。要么您的SSL连接在Apache结束,然后您应该将流量反向代理到Tomcat (在这种情况下,Httpd和Tomcat之间的SSL很少有用),要么您使客户端直接连接到Tomcat,并让它处理SSL连接。
我承认,支持这一说法的链接有点不足。我想我可能错了(我只是从来没有见过这样做,但这并不意味着它不存在……)。
正如您所知道的,您需要在用户代理和SSL端点(在本例中,您希望它是Tomcat)之间建立一个直接连接或完全中继的连接。这意味着Apache Httpd将无法查看URL:它最多只能知道主机名(当使用Server name指示时)。
唯一不依赖于mod_proxy documentation中的URL的选项是AllowCONNECT,它被用于用于HTTPS的转发代理服务器。
即使是the options in mod_proxy_balancer也希望在配置的某个点上有一条路径。它的文档没有提到SSL/HTTPS (“它提供了对HTTP、FTP和AJP13协议的负载平衡支持”),而mod_proxy在提到CONNECT时至少谈到了SSL。
我会建议几个选择:
iptables-based负载均衡器,不通过Httpd,直接在Tomcat中结束连接。第二种选择需要更多的配置来处理客户端证书和Tomcat的安全约束。
如果你已经用<transport-guarantee>CONFIDENTIAL</transport-guarantee>配置了你的webapp,你将需要让Tomcat将连接标记为安全,尽管它看到它们来自它的普通HTTP端口。对于Tomcat5,here is an article (最初是法语的,但自动翻译还不错)描述了如何实现一个阀门来设置isSecure()。(如果您不熟悉valves,它们类似于过滤器,但在请求被传播到webapp之前在Tomcat内部运行。它们可以在Catalina中配置)我认为从Tomcat5.5开始,HTTP connector secure option完全可以做到这一点,而不需要你自己的阀门。AJP连接器也有类似的选项(如果使用mod_proxy_ajp或mod_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的东西。我不记得确切的细节了,但重要的是要确保这个头被清除,这样它就永远不会来自客户端的浏览器(否则谁会伪造它)。如果你需要完整的链条,你可以试试this Httpd patch attempt。这种方法可能需要一个额外的阀/过滤器来将报头转换为javax.servlet.request.X509Certificate (通过解析PEM块)。
可能会感兴趣的其他几点:
CLIENT-CERT指令不会使Httpd请求客户端证书(这是通过在直接使用SSLSession连接器时可以访问JSSE的阀门来完成的)。您可能需要在Httpd中配置匹配路径才能请求client-certificate.https://stackoverflow.com/questions/10133711
复制相似问题