使用TLS时,通过LDAP进行身份验证失败

时间:2013-07-03 11:53:22

标签: java ldap

我在网上发现了几个关于这个问题的讨论,但没有一个对我有用 我正在尝试使用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
        ....
        mail: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://”尝试了它,但得到了相同的响应。
这是证书问题吗?或者代码中是否有任何遗漏?

谢谢

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

查看JNDI Example

我们用他们的榜样取得了良好的成果。

相关问题