首页 > 解决方案 > 在 java 中使用本地证书颁发机构的证书通过 SSL 连接 Active Directory

问题描述

我域中的所有 PC 都预装了 CA 证书。我想要的只是通过 SSL 从我的 java 程序连接到 LDAP(实际上是 Active Directory)。

我已经尝试过没有 SSL 的简单连接,下一个代码对我来说工作正常:

Hashtable<String, String> env = new Hashtable<>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "LDAP://" + domain + ":389");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, username + "@" + domain);
env.put(Context.SECURITY_CREDENTIALS, securityToken);
context = new InitialDirContext(env);

现在我正在尝试使用类似的代码来创建 SSL 连接,使用来自 Windows 证书存储的证书:

Hashtable<String, String> env = new Hashtable<>();
System.setProperty("javax.net.ssl.trustStore", "NUL");
System.setProperty("javax.net.ssl.trustStoreType", "Windows-ROOT");
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "LDAPS://" + domain + ":636");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, username + "@" + domain);
env.put(Context.SECURITY_CREDENTIALS, securityToken);
env.put(Context.SECURITY_PROTOCOL, "ssl");
context = new InitialDirContext(env);

它让我有一些例外......

javax.naming.CommunicationException: simple bind failed
[Root exception is java.net.SocketException: Connection or outbound has closed]

Ldp.exe 可以通过 SSL 连接到 AD 没有任何问题!

标签: javasslldap

解决方案


推荐阅读