具有Jetty和Null Cipher的双向SSL

时间:2012-07-28 01:07:17

标签: java encryption ssl jetty

我有一个在Jetty中运行的应用程序。在它面前,我有一个负载平衡器。要求是由负载均衡器完成SSL解密,而Web容器仅进行SSL客户端身份验证。

理论上说,负载均衡器在解密内容方面非常有效,并且可以将其直接传递给Web容器。

知道如何实现这一目标吗?

1 个答案:

答案 0 :(得分:6)

你的标题中“Null Cipher”的含义并不清楚。有3 possible candidatesTLS_NULL_WITH_NULL_NULLTLS_RSA_WITH_NULL_MD5TLS_RSA_WITH_NULL_SHA。第一个不执行任何身份验证,它们都不提供任何加密。它们对你的目标肯定没用。在浏览器和负载均衡器之间使用普通密码套件(包括身份验证和加密)。负载均衡器和工作节点之间的加密通常是可选的,只有在您不信任它们所在的网络时才需要(这将是一个完全不同的SSL / TLS连接,并且与客户端证书无关)由最终浏览器完成的身份验证。)

只有SSL / TLS服务器可以请求(并验证)客户端证书身份验证。在这种情况下,这将是负载均衡器。

如果您希望负载均衡器处理您的SSL / TLS流量,它应该验证证书(可能是针对您配置的CA),然后将证书信息中继到工作节点。

如何执行此操作取决于负载均衡器。如果它是Apache Httpd服务器,mod_proxy_ajp将通过AJP协议(SSLOptions +ExportCertData +StdEnvVars)中继客户端证书。 mod_jk还可以在需要时传递完整的客户端证书链(JkOptions +ForwardSSLCertChain)。

如果你想使用mod_proxy_http,一个技巧是通过HTTP标头(mod_header)传递证书,使用RequestHeader set X-ClientCert %{SSL_CLIENT_CERT}s之类的东西。如果它来自客户端的浏览器(否则可以伪造它),您应该确保清除此标头。在这种情况下,您需要编写一个过滤器作为Jetty服务器的一部分来处理该标头,并将其置于javax.servlet.request.X509Certificate HttpServletRequest属性中(它应该是X509Certificate的数组)。在此之后,您应该或多或少地处于与AJP相同的阶段。如果它们能够以类似的方式填充HTTP标头,这也可以与其他负载平衡器一起使用。