Как сбросить пароль пользователя на сервере RedHat Directory с помощью Java-кода через LDAPS?

Как я могу получить доступ к серверу каталогов RedHat / серверу каталогов HP UX с помощью LDAPS из моего приложения Java? Я пытаюсь получить к нему доступ через LDAP, он работает нормально, но при использовании LDAPS он не устанавливает соединение с сервером.

Вот мой код, который не работает:

public void setPassword(String userDn,String password) {
    InitialDirContext ctx=null;
    DirContext connection;
    Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.SECURITY_AUTHENTICATION, "simple");
    String systemname = "ldaps://myserver:636";
    env.put(Context.PROVIDER_URL, systemname);  
    env.put(Context.SECURITY_PRINCIPAL, "cn=directory manager");
    env.put(Context.SECURITY_CREDENTIALS, "MySecret");
    ctx = new InitialDirContext(env);
    connection = (DirContext)ctx;
    connection.lookup("dc=mydomain,dc=com");
    ModificationItem[] mods = new ModificationItem[1];
    Attribute mod0 = new BasicAttribute("userpassword",password);
    mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, mod0);
    connection.modifyAttributes(userDn, mods);
    connection.close();
}

Приведенный выше код отлично работает, если я заменю ldaps на ldap.

Но мне нужно, чтобы код работал и для LDAPS. На некоторых сайтах упоминается необходимость хранилища ключей, сертификата и т. д. Но я ничего об этом не знаю.


person Arun    schedule 15.10.2012    source источник
comment
Что значит не работает? Вы получаете какое-либо исключение из сообщения об ошибке?   -  person Joachim Sauer    schedule 15.10.2012
comment
разве это не ssl-порт «636»? Мой ответ может быть полной ерундой, если это просто проблема   -  person Petesh    schedule 15.10.2012
comment
Нет, он не работает и для номера порта «636».   -  person Arun    schedule 15.10.2012
comment
Он выдает следующие исключения: javax.naming.CommunicationException: hpuxserver1:636 [Корневое исключение — java.net.ConnectException: время ожидания подключения истекло: подключение] в com.sun.jndi.ldap.Connection.‹init›(Connection.java: 200) Причина: java.net.ConnectException: время ожидания соединения истекло: подключение к java.net.PlainSocketImpl.socketConnect(собственный метод) к java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351) к java.net.PlainSocketImpl. connectToAddress(PlainSocketImpl.java:213) в java.net.Socket.connect(Socket.java:529)   -  person Arun    schedule 15.10.2012
comment
Таким образом, брандмауэр не имеет открытого порта 636.   -  person user207421    schedule 16.10.2012


Ответы (2)


Поскольку вы используете Java, вам необходимо получить копию сертификата сервера или цепочки центров сертификации и добавить ее в хранилище ключей Java для JVM, которую вы используете со своим кодом.

Способ получения сертификата зависит от используемой реализации LDAP. Администратор LDAP должен быть в состоянии помочь.

Что касается добавления сертификата(ов) в хранилище ключей Java, см. Google.

-Джим

person jwilleke    schedule 16.10.2012

Вы можете попробовать несколько вещей:

  • используйте заведомо исправный инструмент ldapsearch, чтобы убедиться, что клиенты LDAP могут подключаться к серверу
  • используйте openssl s_client -connect host:port, чтобы убедиться, что клиенты могут установить безопасное соединение.
person Terry Gardner    schedule 15.10.2012