首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apache HTTPD/mod_proxy/Tomcat和带有客户端身份验证的SSL

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

Stack Overflow用户
提问于 2012-04-13 08:26:28
回答 1查看 13K关注 0票数 6

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

我有几个网络应用程序运行在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的了解有限。

如果有必要,我很乐意将其移动,但这是一种使用配置文件的编程;)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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中结束连接。

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

第二种选择需要更多的配置来处理客户端证书和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_ajpmod_jk)。

如果使用AJP连接器,mod_proxy_ajp将转发链中的第一个证书,并使其在Tomcat中可用(通过正常的请求属性)。您可能需要SSLOptions +ExportCertData +StdEnvVarsmod_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块)。

可能会感兴趣的其他几点:

  • 如果我没记错的话,你需要专门为Httpd和configure it to use them下载CRL文件。根据您使用的Httpd的版本,您可能必须使用重新协商来获取客户端证书,据我所知,CLIENT-CERT指令不会使Httpd请求客户端证书(这是通过在直接使用SSLSession连接器时可以访问JSSE的阀门来完成的)。您可能需要在Httpd中配置匹配路径才能请求client-certificate.
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10133711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档