当我将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的以下release notes
更改
core-libs / javax.naming ➜改善LDAP支持 端点识别已在LDAPS连接上启用。
要提高LDAPS(基于TLS的安全LDAP)连接的健壮性,端点标识 算法已默认启用。
请注意,在某些情况下,某些以前能够成功连接的应用程序 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
为真。
上下文接口中也没有与此相关的常量String变量。
如果我恢复为Java 1.8.161版本,则可以正常工作。
答案 0 :(得分:13)
doc讲述的是应用程序系统属性,而不是Ldap上下文环境
然后需要在应用程序的JVM(java命令行)上为该应用程序设置
-Dcom.sun.jndi.ldap.object.disableEndpointIdentification=true
答案 1 :(得分:0)
将IP地址的SAN添加到LDAP中配置的证书中
例如为您的证书请求配置(request.inf)
[RequestAttributes]
SAN="ipaddress=10.233.207.65"
[Extensions]
2.5.29.17 = "{text}"
continue_ = "ipaddress=10.233.207.65"
为了生成证书,类似
keyUsage=digitalSignature,keyEncipherment
extendedKeyUsage=serverAuth
subjectKeyIdentifier=hash
subjectAltName=@alt_names
[alt_names]
IP = 10.233.207.65
在extfile配置中