4

我在网上找到了几个关于这个问题的讨论,但没有一个对我有用。
我正在尝试使用 TLS 连接通过 LDAP 进行身份验证。
使用 ldapsearch 命令和 Java 代码时,我得到了矛盾的响应。
在 ldapsearch 命令中,使用 TLS 进行搜索可以工作并且没有它会失败,
而在 Java 代码中,标准 LDAPS 连接工作并且 TLS 失败。

这是 ldapsearch 结果:

使用 TLS:

/usr/bin/ldapsearch -h ldap.server.com -Z -x -D "#BIND_DN#" -W -b "#SEARCH_BASE#" -s sub "(cn=#USERNAME#)"
输入LDAP密码:XXXXXXXX
....
邮件:test.user@ldap.server.com
结果:0 成功

没有 TLS:

/usr/bin/ldapsearch -h ldap.server.com -p 636 -x -D "#BIND_DN#" -W -b "#SEARCH_BASE#" -s sub "(cn=#USERNAME#)"
输入 LDAP 密码: XXXXXXXXX
ldap_result:无法联系 LDAP 服务器 (-1)

以下是 Java 结果:

没有 TLS:

>>java -cp lib com.myapp.toolkit.auth.LDAPTestKit
[LDAPTestKit] found authenContext.
[LDAPTestKit] Authentication Success
[LDAPTestKit] Found attributes:
[LDAPTestKit] mail : test.user@ldap.server.com

....

使用 TLS:

>>java -cp lib com.myapp.toolkit.auth.LDAPTestKit
ERROR [main] [] [LDAPTestKit] Initial binding - Failure
                [LDAP: error code 1 - TLS already started]

javax.naming.NamingException: [LDAP: error code 1 - TLS already started]; remaining name ''
    at com.sun.jndi.ldap.LdapCtx.mapErrorCode(LdapCtx.java:3107)
    at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:3013)
    at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2820)
    at com.sun.jndi.ldap.LdapCtx.extendedOperation(LdapCtx.java:3192)
    at javax.naming.ldap.InitialLdapContext.extendedOperation(InitialLdapContext.java:164)

我使用以下代码:

bindEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
bindEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
bindEnv.put(Context.REFERRAL, "follow");
bindEnv.put(Context.PROVIDER_URL, "ldaps://ldap.server.com:636");    
bindEnv.put("java.naming.security.principal", "#BIND_DN#");
bindEnv.put("java.naming.security.credentials", "#BIND_PASS#");
LdapContext bindCtx = new InitialLdapContext(bindEnv, null);
// So far O.K
StartTlsResponse tls = (StartTlsResponse) bindCtx.extendedOperation(new StartTlsRequest()); 
// Exception!!!
tls.negotiate();

我尝试使用“ldap://”而不是“ldaps://”,但得到了相同的响应。
是证书问题吗?或者我在代码中遗漏了什么?

谢谢

4

2 回答 2

4

StartTLS 扩展操作旨在通过现有的普通 LDAP 连接建立 TLS 层。正如Balint Bako 昨天指出的那样,如果您连接到LDAPS,即建立到套接字的TLS 连接以使用LDAP,则不需要它。

于 2013-07-05T07:44:39.667 回答
1

查看JNDI 示例

我们用他们的例子取得了很好的效果。

于 2013-07-03T17:33:21.033 回答