我们正在将LDAP迁移为使用SSL。我有一个Spring Boot应用程序,它将使用 spring-boot-starter-data-ldap 和 unboundid-ldapsdk 。
这就是我设置LDAP上下文的方式
@Bean
public LdapContextSource contextSource() {
LOGGER.info("Loading LDAP Context");
LdapContextSource contextSource = new LdapContextSource();
contextSource.setUrl(url);
contextSource.setBase(base);
contextSource.setUserDn(username);
contextSource.setPassword(password);
contextSource.setPooled(true);
System.setProperty("com.sun.jndi.ldap.connect.pool", "true");
System.setProperty("com.sun.jndi.ldap.connect.pool.maxsize", "300");
System.setProperty("com.sun.jndi.ldap.connect.pool.timeout", "300000");
contextSource.afterPropertiesSet();
return contextSource;
}
LdapTemplate
@Bean
public LdapTemplate ldapTemplate() {
return new LdapTemplate(contextSource());
}
我以这种方式设置证书
ClassLoader classLoader = getClass().getClassLoader();
System.setProperty("javax.net.ssl.trustStore", new File(classLoader.getResource("certificates/prod.jks").getFile()).getAbsolutePath());
应用程序正常启动,但是当我在LDAP中查询类似内容时
Filter filter = new EqualsFilter(filterAttr, request.getIdValue());
LdapQuery query = query().searchScope(SearchScope.SUBTREE)
.attributes(PROFILE_ATTRS).filter(filter);
List<LDAPInfoResponse> response = ldapTemplate.search(query, new LDAPInfoResponseAttributesMapper());
我收到以下错误
2018-11-02 11:00:06.640错误10936 --- [nio-9010-exec-1] oaccC [。[。[。[。dispatcherServlet]:Servlet.dispatcherServlet]的Servlet.service()路径[/ ldapuser]引发异常[请求处理失败;嵌套的异常是org.springframework.ldap.CommunicationException:abc.com:636;嵌套异常是javax.naming.CommunicationException:abc.com:636 [根本异常是java.net.SocketException:java.security.NoSuchAlgorithmException:构造实现时出错(算法:默认,提供程序:SunJSSE,类:sun.security.ssl。 SSLContextImpl $ DefaultSSLContext)]]的根本原因
java.io.IOException:无效的密钥库格式 在sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:658)〜[na:1.8.0_171] 在sun.security.provider.JavaKeyStore $ JKS.engineLoad(JavaKeyStore.java:56)〜[na:1.8.0_171] 在sun.security.provider.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:224)〜[na:1.8.0_171] 在sun.security.provider.JavaKeyStore $ DualFormatJKS.engineLoad(JavaKeyStore.java:70)〜[na:1.8.0_171] 在java.security.KeyStore.load(KeyStore.java:1445)〜[na:1.8.0_171] 在sun.security.ssl.TrustManagerFactoryImpl.getCacertsKeyStore(TrustManagerFactoryImpl.java:226)〜[na:1.8.0_171] 在sun.security.ssl.SSLContextImpl $ DefaultManagersHolder.getTrustManagers(SSLContextImpl.java:771)〜[na:1.8.0_171] 在sun.security.ssl.SSLContextImpl $ DefaultManagersHolder。(SSLContextImpl.java:748)〜[na:1.8.0_171] 在sun.security.ssl.SSLContextImpl $ DefaultSSLContext。(SSLContextImpl.java:913)〜[na:1.8.0_171] 在sun.reflect.NativeConstructorAccessorImpl.newInstance0(本地方法)〜[na:1.8.0_171] 在sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)〜[na:1.8.0_171] 在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)〜[na:1.8.0_171] 在java.lang.reflect.Constructor.newInstance(Constructor.java:423)〜[na:1.8.0_171] 在java.security.Provider $ Service.newInstance(Provider.java:1595)〜[na:1.8.0_171] 在sun.security.jca.GetInstance.getInstance(GetInstance.java:236)〜[na:1.8.0_171] 在sun.security.jca.GetInstance.getInstance(GetInstance.java:164)〜[na:1.8.0_171] 在javax.net.ssl.SSLContext.getInstance(SSLContext.java:156)〜[na:1.8.0_171] 在javax.net.ssl.SSLContext.getDefault(SSLContext.java:96)〜[na:1.8.0_171] 在javax.net.ssl.SSLSocketFactory.getDefault(SSLSocketFactory.java:122)〜[na:1.8.0_171] 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)〜[na:1.8.0_171] 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)〜[na:1.8.0_171] 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)〜[na:1.8.0_171] 在java.lang.reflect.Method.invoke(Method.java:498)〜[na:1.8.0_171] 在com.sun.jndi.ldap.Connection.createSocket(Connection.java:284)〜[na:1.8.0_171] 在com.sun.jndi.ldap.Connection。(Connection.java:203)〜[na:1.8.0_171] 在com.sun.jndi.ldap.LdapClient。(LdapClient.java:137)〜[na:1.8.0_171] 在com.sun.jndi.ldap.LdapClient.getInstance(LdapClient.java:1615)〜[na:1.8.0_171] 在com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2749)〜[na:1.8.0_171] 在com.sun.jndi.ldap.LdapCtx。(LdapCtx.java:319)〜[na:1.8.0_171] 在com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:192)〜[na:1.8.0_171] 在com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:210)〜[na:1.8.0_171] 在com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:153)〜[na:1.8.0_171] 在com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:83)〜[na:1.8.0_171] 在javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:684)〜[na:1.8.0_171] 在javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)〜[na:1.8.0_171]
我真的不认为这与证书有关,因为该证书是公司给我的,并且可以为其他人使用。不知道我的配置是否做错了。
谢谢