0

我编写了一个 servlet 过滤器来为 Web 应用程序添加安全性。在某些情况下,我想验证与应用程序服务器的连接是通过双向 SSL (TLS 1.0) 建立的。通常这是通过HttpServletRequest.getAttribute("javax.servlet.request.X509Certificate"); 但是,在我的情况下,应用程序服务器前面有一个反向代理,该代理通过WL-Proxy-Client-Cert标题。因此,当我检索上述属性时,我得到了最初出现在标头中的客户端证书。我要做的不仅是验证客户端证书,还要确保反向代理和应用程序服务器之间的连接受到双向 SSL 的保护。有没有办法让我从 servlet 进行此验证?我正在使用 WebLogic 10.3.4、Java EE 5。将 WebLogic SSL 端口配置为需要双向 SSL 不是一种选择,因为同一服务器上的某些其他服务只需要单向 SSL。

4

3 回答 3

0

无论客户端是 Web 浏览器还是您的反向代理,检查客户端证书都是相同的。只需获取该"javax.servlet.request.X509Certificate"属性并检查它是否与您的反向代理匹配(基于 DN 或颁发者)。

WL-Proxy-Client-Cert只有在验证提交给应用服务器的证书是代理的证书后,应用服务器想知道提交给代理的客户端证书是什么时才会发挥作用。

于 2012-10-29T21:45:03.720 回答
0

您将在过滤器的原始请求中使用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代表证书链的数组(首先是客户端证书,然后是颁发者)。您可以使用 a CertificateFactory(参见示例)或 BouncyCastle进行转换PEMReader

您可以在那里验证这些证书,但我想说这样做没有什么意义。当用户和代理之间的连接完成时,这应该在反向代理中完成。如果您不信任代理,它仍然可以向您发送它想要的任何证书:您将无法从工作节点检查用户是否拥有该证书的私钥,只有反向代理可以做到这一点。

话虽如此,您当然可以使用以这种方式获得的客户端证书做出授权决策(同样,前提是您信任反向代理:因此,您必须验证以一种或另一种方式向您发送该信息的反向代理)。

于 2012-10-31T14:37:34.163 回答
-2

除非有双向 SSL 身份验证,否则不会有客户端证书。证书的存在就足以证明。

于 2012-10-29T21:38:05.257 回答