Вопрос по java – Подключите активный каталог с поддержкой ssl (ldaps)

2

пытаюсь подключиться с активной директорией с поддержкой 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?

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

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

Ваш Ответ

2   ответа
0

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

  1. Open MMC
  2. Add Snap In > Certificates > Computer > Local Computer
  3. Navigate to Personal > Certificates
  4. Delete any old certificates issued to this machine (in my case, these were issued by the old CA)
  5. Right click on Certificates folder, click Request New Certificate.
  6. Follow the steps to issue the new certificate to your domain controller.
  7. Restart (not sure if this is necessary, but I restarted before it worked)
-1

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

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

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

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

Error: User Rate Limit Exceeded

Похожие вопросы