Javax.naming.CommunicationException: сбой простого соединения
При попытке подключиться к LDAP-серверу с помощью простого приложения LDAP я получаю сообщение об ошибке "Сбой простого соединения". Я предполагаю, что это связано с каким-то BIND. У меня есть свойство bind в одном из файлов свойств для другого приложения, но я не уверен, как передать это свойство этой программе.
Нужно ли добавлять дополнительные сведения?
Код
import javax.naming.directory.*;
import javax.naming.*;
import java.util.Vector;
import java.util.Enumeration;
import java.util.Properties;
public class SearchLDAP {
public static void main(String[] args) {
String base = "";
String filter = "(objectclass=*)";
Properties env = new Properties();
env.put(DirContext.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
env.put(DirContext.PROVIDER_URL,"ldaps://misguided.com.au:343");
try {
System.out.println("11");
DirContext dc = new InitialDirContext(env);
System.out.println("22");
SearchControls sc = new SearchControls();
sc.setSearchScope(SearchControls.OBJECT_SCOPE);
NamingEnumeration ne = null;
ne = dc.search(base, filter, sc);
while (ne.hasMore()) {
SearchResult sr = (SearchResult) ne.next();
System.out.println(sr.toString()+"\n");
}
dc.close();
} catch (NamingException nex) {
System.err.println("Error: " + nex.getMessage());
nex.printStackTrace();
}
}
}
Ошибка, которую я получаю,
Ошибка
11
Error: simple bind failed: XXXX.XXX.XXXX.net:808
javax.naming.CommunicationException: simple bind failed: misguided.com.au:343 [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]
at com.sun.jndi.ldap.LdapClient.authenticate(LdapClient.java:215)
at com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2740)
at com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:316)
at com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:193)
Ответы
Ответ 1
Вопрос немного старше, но довольно распространен. Попытка объяснить это короче:
Проблема возникает из-за отсутствия сертификатов SSL в хранилище ключей JRE.
Для соединения LDAPS или HTTPS среда выполнения Java должна использовать соответствующий SSL-сертификат для создания защищенного соединения с сервером на другом конце.
Чтобы получить сертификат SSL из своего хранилища ключей, сначала необходимо установить сертификат в хранилище Java Key. Команда "keytool" помогает импортировать/экспортировать сертификаты в Java Keystore и из него.
keytool –import -file adserv.crt -keystore <location to keystore>
Когда он отсутствует, вы получаете:
"sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target".
Итак, все, что вам нужно сделать, это установить сертификат, прежде чем устанавливать защищенное соединение.
Ответ 2
Вы пытаетесь работать с LDAP через SSL (ldaps в имени протокола + ваши точки исключения к этому). У вас нет сертификатов, поэтому SSL не работает. У вас есть 2 варианта:
- Не работает с SSL
- Правильно настройте сертификаты.
Ответ 3
Я также получил ту же ошибку, что и ниже. Добавление исправления, если это кому-то помогает.
Я получил от IBM WAS 8.5 при подключении к LDAP.
Мне нужно было убедиться, что "Keystore name" выбрано в NodeDefaultKeystore
и псевдонимы "нет"
Сертификат SSL и управление ключами > Конфигурации SSL > NodeDefaultSSLSettings
Вызвано: javax.naming.CommunicationException: сбой простого связывания: xxxxxx-xxx.xxxxx.xxx:636 [Исключение корня is javax.net.ssl.SSLHandshakeException: удаленное соединение с узлом удаленного доступа во время рукопожатия]