我已经编写了一个servlet过滤器来为web应用程序增加安全性。在某些情况下,我想验证与应用程序服务器的连接是否使用双向SSL (TLS1.0)。通常,这是通过HttpServletRequest.getAttribute("javax.servlet.request.X509Certificate")
完成的;但是,在我的情况下,应用程序服务器前面有一个反向代理,该代理通过WL-Proxy-Client-Cert
标头将客户端证书传递给应用程序服务器。因此,当我检索前面提到的属性时,我得到了最初出现在报头中的客户端证书。我要做的不仅是验证客户端证书,还要确保反向代理和应用程序服务器之间的连接使用双向SSL进行保护。有没有一种方法可以让我在servlet中进行验证?我使用的是SSL10.3.4,JavaEE5。不能将SSL端口配置为需要双向WebLogic,因为同一台服务器上的其他一些服务只需要单向WebLogic。
发布于 2012-10-29 21:45:04
无论客户端是web浏览器还是反向代理,检查客户端证书的过程都是相同的。只需获取"javax.servlet.request.X509Certificate"
属性并检查它是否与您的反向代理匹配(基于DN或颁发者)。
只有当应用程序服务器在验证提供给应用程序服务器的证书是代理的证书之后,才想知道向代理服务器提供了什么客户端证书时,WL-Proxy-Client-Cert
才会起作用。
发布于 2012-10-31 14:37:34
在使用HttpServletRequest.getAttribute("javax.servlet.request.X509Certificate")
的过滤器中,您将在原始请求中获得应用程序服务器所看到的证书:这将是反向代理自己的客户端证书(如果它正在使用的话)。
根据您的需求,如果需要,您可以基于此属性做出与授权相关的决策。您不需要验证是否信任证书本身,因为身份验证应该由应用程序服务器的SSL连接器完成(配置了适当的信任存储区)。
容器中的大多数应用程序可能希望getAttribute("javax.servlet.request.X509Certificate")
引用用户的证书,而不是代理的证书。
目前还不清楚以哪种格式获取WL-Proxy-Client-Cert
附加头的值,但我将假定使用某种PEM格式。您应该能够转换此内容并将其放入筛选器中的javax.servlet.request.X509Certificate
属性中,以免它命中您的筛选器/逻辑的其余部分。这应该是一个表示证书链的java.security.cert.X509Certificate
数组(首先是客户端证书,然后是颁发者)。您可以使用CertificateFactory
(参见示例)或BouncyCastle的PEMReader
进行转换。
您可以在那里验证这些证书,但我想说这样做没有什么意义。当用户和代理之间的连接完成时,这实际上应该在反向代理中完成。如果您不信任代理,它无论如何都可以向您发送它想要的任何证书:您将无法检查用户是否拥有来自工作节点的证书的私钥,只有反向代理可以这样做。
也就是说,您当然可以使用通过这种方式获得的客户端证书做出授权决策(同样,如果您信任反向代理:因此,您必须对以某种方式向您发送信息的反向代理进行身份验证)。
发布于 2012-10-29 21:38:05
除非存在双向SSL身份验证,否则不会有客户端证书。证书的存在就是足够的证明。
https://stackoverflow.com/questions/13129097
复制