【问题标题】:Two Way SSL with Jetty and Null Cipher使用 Jetty 和 Null 密码的两种方式 SSL
【发布时间】:2012-07-28 01:07:16
【问题描述】:

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

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

知道如何实现吗?

【问题讨论】:

    标签: java encryption ssl jetty


    【解决方案1】:

    不清楚标题中的“空密码”是什么意思。有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 标头,这也可以与其他负载均衡器一起使用。

    【讨论】:

    • 布鲁诺,感谢您的回答。我想你是对的,空密码参考有点误导。我的印象是它将成为解决方案的一部分。您在第二种解决方案中描述的内容更类似于我之后的内容。这种方法的通用名称是什么?这是标准的东西吗?你说“在这种情况下......”。 “this”是指标题来自浏览器的情况还是指一般的方法?谢谢。
    • 标头永远不应来自浏览器,只能由负载均衡器插入(如果您使用标头)。在所有情况下,客户端证书验证都将由 SSL/TLS 服务器完成,它是负载均衡器(另一种选择是使用另一种类型的负载均衡器来处理每个工作节点中的 SSL/TLS 连接,但你说过在您的问题中,这不是您想要的)。我认为没有一个标准可以说明您应该使用哪个标头(如果您使用它而不是 APJ)。
    猜你喜欢
    • 1970-01-01
    • 2012-01-04
    • 2018-11-11
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    相关资源
    最近更新 更多