Spring LDAP - java.io.IOException: недопустимый формат хранилища ключей

Мы переводим наш LDAP на использование SSL. У меня есть приложение Spring Boot, которое будет использовать весна-загрузка-стартер-данные-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 ERROR 10936 --- [nio-9010-exec-1] o.a.c.c.C.[.[.[.[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [/ldapuser] threw exception [Request processing failed; nested exception is org.springframework.ldap.CommunicationException: abc.com:636; nested exception is javax.naming.CommunicationException: abc.com:636 [Root exception is java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.SSLContextImpl$DefaultSSLContext)]] with root cause

java.io.IOException: Invalid keystore format 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(Native Method) ~[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] at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_171] at 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] at javax.net.ssl.SSLContext.getInstance(SSLContext.java:156) ~[na:1.8.0_171] at javax.net.ssl.SSLContext.getDefault(SSLContext.java:96) ~[na:1.8.0_171] at javax.net.ssl.SSLSocketFactory.getDefault(SSLSocketFactory.java:122) ~[na:1.8.0_171] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[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] at com.sun.jndi.ldap.Connection.createSocket(Connection.java:284) ~[na:1.8.0_171] at com.sun.jndi.ldap.Connection.(Connection.java:203) ~[na:1.8.0_171] at com.sun.jndi.ldap.LdapClient.(LdapClient.java:137) ~[na:1.8.0_171] at com.sun.jndi.ldap.LdapClient.getInstance(LdapClient.java:1615) ~[na:1.8.0_171] at com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2749) ~[na:1.8.0_171] at 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] at com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:83) ~[na:1.8.0_171] at 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]

Я действительно не думаю, что дело в сертификате, так как он мне был выдан компанией, и он работает для других. Не уверен, что я что-то не так делаю с конфигурацией.

Спасибо,

может файл как-то испортился? вы можете скачать его снова и использовать?

HaseebR7 02.11.2018 18:33

Я делал это несколько раз, но безуспешно.

Demian 02.11.2018 18:39

ты можешь попробовать это? keytool -list -v -keystore keystore.jks

HaseebR7 02.11.2018 18:43

Он запросил у меня пароль, но я не уверен, что он такой же, как тот, который я здесь поместил: contextSource.setPassword (password);

Demian 02.11.2018 19:11

просто нажмите Enter после того, как он запросит пароль.

HaseebR7 02.11.2018 22:14

Когда я выполняю эту команду, я вижу много вещей. Ищу ли я что-то конкретное?

Demian 05.11.2018 00:48
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
430
0

Другие вопросы по теме