【发布时间】:2018-03-01 15:17:00
【问题描述】:
我认为这个问题可能已经在某些地方得到了回答,但到目前为止我还没有找到任何解决方案。我的问题是,我想连接到 LDAP 并从 ldap 目录中找到一个用户,但这里的问题是,它是一个安全的 LDAP,所以我必须通过证书向 ldap 服务器进行身份验证。所以,我已经使用以下命令安装了该证书
keytool -importcert -file D:\KSTLMRADD01.dev.chartercom.com.cer -keystore cacerts -alias KSTLMRADD01.dev.chartercom.com.cer
所以通过使用 system.setproperty 我正在设置 javax.net.ssl.truststore 位置和密钥库密码,由于我在 java 密钥库中有大约 100 个证书,因此在建立连接时无法使用适当的证书,请参阅下面的代码,如果有任何错误或建议,请告诉我。任何帮助都会非常充分。
public class TestLdap{
public static void main(String[] args){
System.setProperty("javax.net.ssl.trustStore", "C:\\Program Files\\Java\\jdk1.8.0_152\\jre\\lib\\security\\cacerts");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
try {
// use the service user to authenticate
Hashtable<String, Object> serviceEnv = new Hashtable<String, Object>();
serviceEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
serviceEnv.put(Context.PROVIDER_URL, ldapUrl);
serviceEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
serviceEnv.put(Context.SECURITY_PROTOCOL, "ssl");
serviceEnv.put(Context.SECURITY_PRINCIPAL, serviceUserDN);
serviceEnv.put(Context.SECURITY_CREDENTIALS, serviceUserPassword);
LdapContext ctx = new InitialLdapContext(environment, null);
ctx.setRequestControls(null);
DirContect context = new InitialDirContext(environment);NamingEnumeration<?> namingEnum = ctx.search("ou=service_accounts,dc=com", "(objectclass=user)", getSimpleSearchControls());
while (namingEnum.hasMore ()) {
SearchResult result = (SearchResult) namingEnum.next ();
Attributes attrs = result.getAttributes ();
System.out.println(attrs.get("sn"));
}
namingEnum.close();
ctx.close();
}}
所以我尝试了 DirContext 和 LdapContext 但两者都不适合我。
【问题讨论】: