我认为这个问题可能已经在某些地方得到了回答,但到目前为止我找不到任何解决方案。我的问题是,我想连接到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,但两者都不适合我。
答案 0 :(得分:1)
通过在代码中设置以下两行,我可以信任那些证书。
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");