当我将Java从1.8.161升级到1.8.181后,我的应用程序无法连接到LDAP,当我尝试使用在LDAP中活动的用户登录应用程序时,出现以下异常:
javax.naming.CommunicationException::[根本异常是 javax.net.ssl.SSLHandshakeException:java.security.cert.CertificateException: 找不到与IP地址匹配的主体替代名称]
我在Oracle网站上找到了以下版本1.8.181的发布说明:
更改
core-libs/javax.naming ➜ 改进LDAP支持 已启用LDAPS连接的端点识别。
为了提高LDAPS(安全LDAP over TLS)连接的鲁棒性,默认情况下启用了端点识别算法。
请注意,在某些情况下,以前能够成功连接到LDAPS服务器的某些应用程序可能无法再这样做。 如果适当,这些应用程序可以使用新的系统属性:com.sun.jndi.ldap.object.disableEndpointIdentification来禁用端点识别。
定义此系统属性(或将其设置为true)以禁用端点识别算法。
我尝试将属性设置为true,如下所示,并附带其他属性。但仍然会抛出相同的错误。
javax.naming.CommunicationException::[根本异常是 javax.net.ssl.SSLHandshakeException:java.security.cert.CertificateException: 找不到与IP地址匹配的主体替代名称]
我在Oracle网站上找到了以下版本1.8.181的发布说明:
更改
core-libs/javax.naming ➜ 改进LDAP支持 已启用LDAPS连接的端点识别。
为了提高LDAPS(安全LDAP over TLS)连接的鲁棒性,默认情况下启用了端点识别算法。
请注意,在某些情况下,以前能够成功连接到LDAPS服务器的某些应用程序可能无法再这样做。 如果适当,这些应用程序可以使用新的系统属性:com.sun.jndi.ldap.object.disableEndpointIdentification来禁用端点识别。
定义此系统属性(或将其设置为true)以禁用端点识别算法。
我尝试将属性设置为true,如下所示,并附带其他属性。但仍然会抛出相同的错误。
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, ctxFactory);
env.put(Context.PROVIDER_URL, providerUrl);
env.put(Context.SECURITY_PRINCIPAL, secPrincipal);
env.put(Context.SECURITY_AUTHENTICATION, secAuthentication);
env.put(Context.SECURITY_CREDENTIALS, secCredentials);
env.put("com.sun.jndi.ldap.object.disableEndpointIdentification" ,disableEndpointIdentification);
DirContext ldapCtx = new InitialDirContext(env);
需要您的帮助,确定在哪里以及如何设置属性com.sun.jndi.ldap.object.disableEndpointIdentification
为true。
Context接口中也没有与此相关的常量字符串变量。
如果我回退到Java 1.8.161版本,它可以正常工作。