通过Java连接到LDAP的SSL

时间:2013-06-27 16:46:44

标签: java ssl ldap

更新:我从来没有通过SSL工作。我最终实现了VPN以获得安全性。

我已经对这个问题进行了2天的解决,并且无法理解我的生活。我已经回顾了以下主题:

Resolving javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed Error?

https://stackoverflow.com/questions/14465089/ssl-connection-in-glassfish-3-1

其他许多人。

更新:抱歉,我甚至没有发布我收到的错误。这是:

javax.naming.CommunicationException: simple bind failed: server.local:636 [Root exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target]

我也在Win7 pro上使用GlassFish服务器3.1.2和NetBeans 7.3。

以下是导致错误的代码:

Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://server.local:636/");

// Specify SSL
env.put(Context.SECURITY_PROTOCOL, "ssl");

// Fill in secuirty/bind variables
env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
env.put(Context.SECURITY_PRINCIPAL, config.Config.getSECURITY_PRINCIPAL()); //returns user@domain.local
env.put(Context.SECURITY_CREDENTIALS, config.Config.getSECURITY_CREDENTIALS()); //returns password

// Create the initial context
ctx =  new InitialDirContext(env); //defined above as InitialDirContext ctx = null;

我已使用ldp.exe确认在我们的AD服务器上正确配置了SSL。此外,我尝试了以下内容:

  1. 按照概述here
  2. 导入客户端证书(以及来自AD CS的CA根证书)

    一个。我使用了以下命令:

    C:\Program Files (x86)\Java\jdk1.7.0_25>bin\keytool -import -file SBS2011.sage.local_sage-SBS2011-CA.crt -keystore .\jre\lib\security\cacerts -alias SBS2011
    Enter keystore password:
    Certificate already exists in keystore under alias <mykey>
    Do you still want to add it? [no]:  yes
    Certificate was added to keystore
    

    C:\ Program Files(x86)\ Java \ jdk1.7.0_25&gt;

    1. 卸载Java并重新安装,然后重复步骤1.

    2. 添加以下代码行:

      System.setProperty("javax.net.ssl.trustStore", "C:\\Program Files (x86)\\Java\\jdk1.7.0_25\\jre\\lib\\security\\cacerts");

      System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

    3. 其他说明:代码在使用非SSL连接时工作正常但在尝试更新用户信息时遇到LDAP错误53。最后,如果有一个涉及不使用SSL的解决方案,我不介意。

1 个答案:

答案 0 :(得分:3)

您的信任库不信任LDAP服务器证书。

上面的步骤(3)是默认值。

如果您的LDAP服务器具有CA签名证书,则步骤(1)是不必要的。

我不知道为什么在您可能需要导入的 LDAP服务器证书时,您会说“客户端证书”。

env.put(Context.PROVIDER_URL, "ldap://server.local:636/");

应该是

env.put(Context.PROVIDER_URL, "ldaps://server.local:636/");