Подключить активную директорию с поддержкой ssl (ldaps)

я пытаюсь подключиться к активному каталогу с поддержкой ssl.

Я попробовал шаги со следующего веб-сайта.

http://confluence.atlassian.com/display/CROWD/Configuring+an+SSL+Certificate+for+Microsoft+Active+Directory

когда я пытаюсь подключить активный каталог из кода Java, он дает следующую ошибку.

Exception in thread "main" javax.naming.CommunicationException: simple bind fail
ed: 172.16.12.4:636 [Root exception is java.net.SocketException: Connection rese
t]
        at com.sun.jndi.ldap.LdapClient.authenticate(Unknown Source)
        at com.sun.jndi.ldap.LdapCtx.connect(Unknown Source)
        at com.sun.jndi.ldap.LdapCtx.<init>(Unknown Source)
        at com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(Unknown Source)
        at com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(Unknown Source)
        at com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(Unknown Source)
        at com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(Unknown Source)
        at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
        at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
        at javax.naming.InitialContext.init(Unknown Source)
        at javax.naming.InitialContext.<init>(Unknown Source)
        at javax.naming.directory.InitialDirContext.<init>(Unknown Source)
        at ConnectActiveDirectory.main(ConnectActiveDirectory.java:39)
Caused by: java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(Unknown Source)
        at com.sun.net.ssl.internal.ssl.InputRecord.readFully(Unknown Source)
        at com.sun.net.ssl.internal.ssl.InputRecord.read(Unknown Source)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)

        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.waitForClose(Unknown Sourc
e)
        at com.sun.net.ssl.internal.ssl.HandshakeOutStream.flush(Unknown Source)

        at com.sun.net.ssl.internal.ssl.Handshaker.kickstart(Unknown Source)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.kickstartHandshake(Unknown
 Source)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Un
known Source)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(Unknown Source
)
        at com.sun.net.ssl.internal.ssl.AppOutputStream.write(Unknown Source)
        at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
        at java.io.BufferedOutputStream.flush(Unknown Source)
        at com.sun.jndi.ldap.Connection.writeRequest(Unknown Source)
        at com.sun.jndi.ldap.Connection.writeRequest(Unknown Source)
        at com.sun.jndi.ldap.LdapClient.ldapBind(Unknown Source)
        ... 13 more

Код, который я использую,

import java.util.Hashtable;
import javax.naming.*;
import javax.naming.directory.*;

public class ConnectActiveDirectory {

    public static void main(String[] args) throws NamingException {
        Hashtable env = new Hashtable();
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        env.put(Context.SECURITY_PRINCIPAL,"[email protected]");
        env.put(Context.SECURITY_CREDENTIALS, "password");
        env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, "ldaps://172.16.12.4:636/cn=Users,dc=mysite,dc=com");
        try{
            java.io.InputStream in = new java.io.FileInputStream("C:\\client.crt");
            java.security.cert.Certificate c = java.security.cert.CertificateFactory.getInstance("X.509").generateCertificate(in);
            java.security.KeyStore ks = java.security.KeyStore.getInstance("JKS");
            ks.load(null);
            if (!ks.containsAlias("alias ldap")) {
                ks.setCertificateEntry("alias ldap", c);
            }
            java.io.OutputStream out = new java.io.FileOutputStream("C:\\keystorefile.jks");
            char[] kspass = "changeit".toCharArray();
            ks.store(out, kspass);
            out.close();        
        }catch(Exception e){
            e.printStackTrace();
        }
        System.setProperty("javax.net.ssl.trustStore", "C:\\keystorefile.jks");
        DirContext ctx = new InitialDirContext(env);
        NamingEnumeration enm = ctx.list("");
        while (enm.hasMore()) {
            System.out.println(enm.next());
        }
        ctx.close();
    }
}

я делаю какую-либо ошибку?

где я могу получить хороший учебник, чтобы сделать ssl-соединение с активным каталогом?

делает http://confluence.atlassian.com/display/CROWD/Configuring+an+SSL+Certificate+for+Microsoft+Active+Directory имеет правильные шаги для создания и подключения активного каталога с ssl?

может кто-нибудь, пожалуйста, помогите мне.


person Mohan    schedule 16.05.2012    source источник
comment
это сработало хорошо, когда я перезапустил свой сервер. и confluence.atlassian.com/display Ссылка /CROWD/ — хороший учебник.   -  person Mohan    schedule 16.05.2012
comment
Пустое хранилище ключей не будет содержать никаких псевдонимов, поэтому проверка наличия псевдонима бесполезна. И почему ваш сертификат сервера хранится в файле с именем client.crt — еще одна загадка. А что должно происходить при обновлении сертификата сервера, другое. Это плохая техника.   -  person user207421    schedule 28.07.2016
comment
Можете ли вы включить отладку SSL (например, -Djavax.net.debug=all) и собрать больше информации о рукопожатии SSL? Это этап, на котором он терпит неудачу.   -  person    schedule 09.03.2018


Ответы (2)


У меня была аналогичная проблема после того, как мой домен AD был переименован. После переустановки служб сертификатов вам необходимо удалить и повторно выдать сертификат, выданный вашему контроллеру домена. Шаги:

  1. Открыть ММС
  2. Добавить оснастку > Сертификаты > Компьютер > Локальный компьютер
  3. Перейдите в Личные > Сертификаты
  4. Удалите все старые сертификаты, выданные этой машине (в моем случае они были выданы старым ЦС).
  5. Щелкните правой кнопкой мыши папку «Сертификаты», выберите «Запросить новый сертификат».
  6. Следуйте инструкциям, чтобы выдать новый сертификат для вашего контроллера домена.
  7. Перезапустите (не уверен, что это необходимо, но я перезапустил, прежде чем это сработало)
person Dustin    schedule 24.01.2015

У меня было такое же сообщение об ошибке при использовании Atlassian Crowd и Active Directory через SSL. Это не применимо к этому конкретному вопросу, но когда я попытался выяснить, что происходит, эта ветка была первым поисковым запросом Google, поэтому я запишу ее здесь.

В моем случае я сначала тестировал без SSL, а затем перешел на SSL. Оказывается, я забыл изменить протокол, используемый в настройках Crowd Connector.

До: ldap://:389 После: ldaps://:636

Случайное использование ldap://:636 дало мне ошибку «Сброс соединения».

person user1965929    schedule 10.01.2013
comment
Но ОП использует ldaps:. - person user207421; 09.07.2018