如何为Java 1.8.181版本禁用端点标识

时间:2018-07-20 20:18:41

标签: java java-8 ldap

当我将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版本,则可以正常工作。

2 个答案:

答案 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配置中