Мы перемещаем наш 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.service () для сервлета [dispatcherServlet] в контексте с путем [/ 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: неверный формат хранилища ключей
at sun.security.provider.JavaKeyStore.engineLoad (JavaKeyStore.java:658) ~ [na: 1.8.0_171]
at sun.security.provider.JavaKeyStore $ JKS.engineLoad (JavaKeyStore.java:56) ~ [na: 1.8.0_171]
at sun.security.provider.KeyStoreDelegator.engineLoad (KeyStoreDelegator.java:224) ~ [na: 1.8.0_171]
at sun.security.provider.JavaKeyStore $ DualFormatJKS.engineLoad (JavaKeyStore.java:70) ~ [na: 1.8.0_171]
at java.security.KeyStore.load (KeyStore.java:1445) ~ [na: 1.8.0_171]
at sun.security.ssl.TrustManagerFactoryImpl.getCacertsKeyStore (TrustManagerFactoryImpl.java:226) ~ [na: 1.8.0_171]
at sun.security.ssl.SSLContextImpl $ DefaultManagersHolder.getTrustManagers (SSLContextImpl.java:771) ~ [na: 1.8.0_171]
at sun.security.ssl.SSLContextImpl $ DefaultManagersHolder. (SSLContextImpl.java:748) ~ [na: 1.8.0_171]
at sun.security.ssl.SSLContextImpl $ DefaultSSLContext. (SSLContextImpl.java:913) ~ [na: 1.8.0_171]
at sun.reflect.NativeConstructorAccessorImpl.newInstance0 (собственный метод) ~ [na: 1.8.0_171]
at sun.reflect.NativeConstructorAccessorImpl.newInstance (NativeConstructorAccessorImpl.java:62) ~ [na: 1.8.0_171]
at 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]
at sun.security.jca.GetInstance.getInstance (GetInstance.java:236) ~ [na: 1.8.0_171]
at 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]
at sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) ~ [na: 1.8.0_171]
at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) ~ [na: 1.8.0_171]
at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) ~ [na: 1.8.0_171]
at 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]
at com.sun.jndi.ldap.LdapCtxFactory.getUsingURL (LdapCtxFactory.java:192) ~ [na: 1.8.0_171]at com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs (LdapCtxFactory.java:210) ~ [na: 1.8.0_171]
at 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]
at javax.naming.InitialContext.getDefaultInitCtx (InitialContext.java:313) ~ [na: 1.8.0_171]
Я не думаю, что речь идет о сертификате, так как он был выдан компанией, и он работает для других. Не уверен, что я что-то не так с конфигурацией.
Спасибо