2012-05-16 39 views
2

的支持下连接活动目录,试图在ssl的支持下连接到活动目录。在ssl(ldaps)

我尝试了以下网站的步骤。

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

当我尝试从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?

可以请任何帮助我。

+0

这个工作很好,当我重新启动我的服务器。和http://confluence.atlassian.com/display/CROWD/Configuring+an+SSL+Certificate+for+Microsoft+Active+Directory链接是一个很好的教程。 – Mohan

+0

空的密钥库不会包含任何别名,因此测试别名的存在是徒劳的。为什么你的服务器证书被保存在一个名为'client.crt'的文件中是另一个谜团。另外,当服务器证书更新时应该发生什么。这是不好的技术。 – EJP

+0

您是否可以启用SSL调试(例如-Djavax.net.debug = all)并收集有关SSL握手的更多信息?这是它失败的阶段。 –

回答

0

我有通过SSL使用Atlassian Crowd和Active Directory的相同错误消息。它不适用于这个特定的问题,但是当我试图找出发生的事情时,这个线程是第一个Google搜索结果,所以我会在这里写下来。

在我的情况下,我第一次测试没有SSL,然后更改为SSL。事实证明,我忘了更改群众连接器设置中使用的协议。

前:LDAP://:389 后:LDAPS://:636

无意中使用LDAP://:636给我的 “连接复位” 的错误。

0

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

  1. 打开MMC
  2. 添加管理单元>证书>计算机>本地计算机
  3. 导航到个人>证书
  4. 删除颁发给这台机器(在我的情况下,任何旧的证书,这些发行由旧CA)
  5. 右键单击证书文件夹,单击请求新证书。
  6. 按照步骤向您的域控制器颁发新证书。
  7. 重启(不知道这是必要的,但我重新启动它的工作之前)