2013-07-03 2 views
3

Я нашел несколько обсуждений по этой проблеме в сети, но ни один из них не работал для меня.
Я пытаюсь выполнить аутентификацию через LDAP с использованием TLS-соединения.
Я получаю противоречивые ответы при использовании команды ldapsearch и кода Java.
В команде ldapsearch поиск с TLS работает и завершается без него,
В то время как в коде Java работает стандартное соединение LDAPS и TLS.
Ошибка аутентификации через LDAP при использовании TLS

Вот результаты ldapsearch:

С TLS:

/USR/бен/ldapsearch -h ldap.server.com -Z -x -D "# BIND_DN #" -W -b "# SEARCH_BASE #" -s юга "(сп = # USERNAME #)"
Введите LDAP Пароль: XXXXXXXX
....
почты: [email protected]
Результат: 0 Успех

Без TLS:

/USR/бен/ldapsearch -h ldap.server.com -p 636 -x -D "# BIND_DN #" - W -b "# SEARCH_BASE #" -s югу "(сп = # 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 : [email protected] 

.... 

С 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: //», но получил тот же ответ.
Это вопрос сертификата? Или что-то мне не хватает в коде?

Благодаря

+0

Вы пробовали без 'StartTlsResponse tls = (StartTlsResponse) bindCtx.extendedOperation (new StartTlsRequest()); tls.negotiate(); '? –

+0

Да, он работает без него. – user1825949

+0

И это то, что вы хотели, не так ли? –

ответ

2

Расширенное действие StartTLS предназначено для установки уровня TLS поверх существующего простого соединения LDAP. Как отметил Балинт Бако вчера, он не нужен, если вы подключаетесь к LDAPS, т. Е. Устанавливаете соединение TLS с сокетом для использования LDAP.

Смежные вопросы