通过 Java 到 LDAP 的 SSL 连接 [重复]

Posted

技术标签:

【中文标题】通过 Java 到 LDAP 的 SSL 连接 [重复]【英文标题】:SSL Connection to LDAP via Java [duplicate] 【发布时间】:2013-06-25 06:56:35 【问题描述】:

更新:我从来没有通过 SSL 进行过这项工作。为了获得安全性,我最终实施了 ***。

我已经解决这个问题 2 天了,但我终其一生都无法解决这个问题。我查看了以下主题:

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

https://***.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 server 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。此外,我尝试了以下方法:

    按照here 所述导入客户端证书(以及来自 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>

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

    添加以下代码行:

    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");

其他注意事项:代码使用非 SSL 连接工作正常,但在尝试更新用户信息时出现 LDAP 错误 53。最后,如果有不使用 SSL 的解决方案,我不介意。

【问题讨论】:

你得到的确切错误是什么? 我在上面添加了更新。抱歉,我之前没有提到。 你是怎么解决这个问题的? 【参考方案1】:

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

您上面的步骤 (3) 是默认设置。

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

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

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

应该是

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

【讨论】:

我添加了用于导入证书的代码,如果有错误请告诉我? (1) 为什么“证书已存在于别名 下的密钥库中”? (2) 如果这应该是 CA 证书,它应该询问您是否信任它,因为您没有指定 -trustcaerts 选项。所以还是有问题。并且不需要同时导入服务器证书和它的 CA 证书,只需要后者。 证书是指服务器的 CA 证书。以前我确实执行了相同的命令,它询问我是否要导入它。我说是的,它说“成功”导入了,但现在每次我尝试导入它时都说它已经存在了。 它对我有用。我仍然不知道您为什么要两次导入相同的东西。如果你认为你做错了,你应该先删除它。

以上是关于通过 Java 到 LDAP 的 SSL 连接 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如果ssl打开,Apache mod auth_ldap将不起作用

C# LDAP 用户更改密码失败。 SSL连接是必须的吗?

如何使用 UnboundID SDK 连接带有 SSL 服务器证书的 LDAP 服务器?

在Linux上的备用连接上抛出SunCertPathBuilderException的LDAP连接

有没有办法连接 ldaps 并忽略 java 中的证书?

如何在 jndi 中启用 ldap over ssl