Java 使用ssl(ldaps)支持连接active directory

Java 使用ssl(ldaps)支持连接active directory,java,ssl,active-directory,keystore,truststore,Java,Ssl,Active Directory,Keystore,Truststore,我正在尝试使用ssl支持与active directory连接 我尝试了以下网站的步骤 当我试图从java代码连接active directory时,它给出了以下错误 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]

我正在尝试使用ssl支持与active directory连接

我尝试了以下网站的步骤

当我试图从java代码连接active directory时,它给出了以下错误

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
我做错什么了吗

在哪里可以获得使用active directory进行ssl连接的良好教程

站点是否有正确的步骤来创建active directory并将其与ssl连接


请帮我一下。

我在SSL上使用Atlassian群组和Active Directory时收到了相同的错误消息。这不适用于这个特定的问题,但当我试图找出发生了什么时,这条线索是谷歌搜索的第一条线索,所以我将把它写在这里

在我的例子中,我首先在没有SSL的情况下进行测试,然后改为SSL。结果是我忘了更改群组连接器设置中使用的协议

之前:ldap://:389 之后:ldaps://:636


意外地使用ldap://:636给了我连接重置错误

我在SSL上使用Atlassian群组和Active Directory时收到了相同的错误消息。这不适用于这个特定的问题,但当我试图找出发生了什么时,这条线索是谷歌搜索的第一条线索,所以我将把它写在这里

在我的例子中,我首先在没有SSL的情况下进行测试,然后改为SSL。结果是我忘了更改群组连接器设置中使用的协议

之前:ldap://:389 之后:ldaps://:636


意外地使用ldap://:636给了我连接重置错误

在我的广告域名被重命名后,我也遇到了类似的问题。重新安装证书服务后,您需要删除并重新颁发颁发给域控制器的证书。步骤:

开放式MMC 添加管理单元>证书>计算机>本地计算机 导航到个人>证书 删除颁发给这台机器的所有旧证书在我的情况下,这些证书是由旧CA颁发的 右键单击证书文件夹,单击请求新证书。 按照以下步骤向域控制器颁发新证书。 重新启动不确定这是否必要,但我在它工作之前重新启动了
我有一个类似的问题后,我的广告域名被重命名。重新安装证书服务后,您需要删除并重新颁发颁发给域控制器的证书。步骤:

开放式MMC 添加管理单元>证书>计算机>本地计算机 导航到个人>证书 删除颁发给这台机器的所有旧证书在我的情况下,这些证书是由旧CA颁发的 右键单击证书文件夹,单击请求新证书。 按照以下步骤向域控制器颁发新证书。 重新启动不确定这是否必要,但我在它工作之前重新启动了
当我重新启动服务器时,效果很好。链接是一个很好的教程。一个空的密钥库不会包含任何别名,所以测试别名的存在是徒劳的。为什么服务器证书保存在一个名为client.crt的文件中是另一个谜。当服务器证书被更新时应该发生什么,另一个问题。这是一项糟糕的技术。您能否启用SSL调试,例如-Djavax.net.debug=all,并收集有关SSL握手的更多信息?这是它失败的阶段。当我重新启动服务器时,它工作得很好。链接是一个很好的教程。一个空的密钥库不会包含任何别名,所以测试别名的存在是徒劳的。为什么服务器证书保存在一个名为client.crt的文件中是另一个谜。当服务器证书被更新时应该发生什么,另一个问题。这是一项糟糕的技术。您能否启用SSL调试,例如-Djavax.net.debug=all,并收集有关SSL握手的更多信息?这就是它失败的阶段。但是OP正在使用ldaps:。但是OP正在使用ldaps:。
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,"Administrator@mysite.com");
        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();
    }
}