Java 8u181(Java 8 Update 181)增强了 LDAPS 连接的安全性:
更改:改进 LDAP 支持 LDAPS 连接上已启用端点识别。为了提高 LDAPS(基于 TLS 的安全 LDAP)连接的稳健性,默认情况下已启用端点识别算法。请注意,在某些情况下,以前能够成功连接到 LDAPS 服务器的某些应用程序可能不再能够这样做。如果这些应用程序认为合适,它们可以使用新的系统属性禁用端点识别:com.sun.jndi.ldap.object.disableEndpointIdentification。定义此系统属性(或将其设置为 true)以禁用端点识别算法。JDK-8200666(非公开)
这些增强功能之一似乎是检查域名是否在证书上。但是,Active Directory 的默认行为似乎是只返回 AD 服务器的名称,而该名称恰好在 AD 域名的许多 A 记录下返回 - 客户端支持主机列表的情况似乎很少见。
我也在 Java 之外看到了这种模式(即 Go 程序现在也会检查这一点)Go 1.10 发行说明中的证书验证部分)。
有一篇有点令人生畏的技术文章,介绍了如何以可更新的方式获取证书上的名称:https://blogs.technet.microsoft.com/russellt/2016/06/03/custom-ldap-certs/
我确信我不是唯一一个遇到这种情况的人:
- 是否有人成功将名称添加到证书中,或者在 LDAPS 前面为通用的非 AD 特定 LDAP 客户端使用负载平衡器?
- 是否有人知道微软是否会以任何方式处理此问题,未来可能会做出改变,使“禁用验证并等待”成为一种明智的策略?
答案1
我们遇到了同样的问题,但几乎没有解决方案可以解决这个问题。
根本原因:仅当您使用池主机名时它才不起作用。
修复 1:将其添加
-Dcom.sun.jndi.ldap.object.disableEndpointIdentification=true
到您的应用程序中JAVA_OPTS
并重新启动 tomcat/应用程序服务器。这是为了避免严格的端点验证。修复 2:使用 LDAPS 演示证书中提到的确切主机名 (FQDN)。
了解您的 LDAPS 服务器 FQDN:。openssl s_client -connect [LDAPS server IP/DNS]:636
尝试使用 IP/DNS 连接 LDAPS 服务器。它在属性中显示准确的 FQDN CN=
。使用该 FQDN 配置 LDAPS 服务器。
- 修复 3:在应用程序服务器中导入 LDAPS 演示证书(不是根证书或中间证书)。