带有Jetty和Null密码的双向SSL



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

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

你知道如何做到这一点吗?

不清楚你说的"空密码";在您的标题中。有3种可能的候选者:TLS_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,一个技巧是使用类似RequestHeader set X-ClientCert %{SSL_CLIENT_CERT}s的东西通过HTTP头(mod_header)传递证书。如果此标头来自客户端的浏览器(否则可能会伪造),则应确保将其清除。在这种情况下,您需要编写一个过滤器作为Jetty服务器的一部分来处理该标头,并将其放入javax.servlet.request.X509CertificateHttpServletRequest属性中(它应该是X509Certificate的数组)。在这之后,你应该或多或少地处于与AJP相同的阶段。如果其他负载均衡器能够以类似的方式填充HTTP标头,那么这也可以与它们一起使用。

最新更新