Файл Cacerts не применяется к TrustStore при работе в Linux - PullRequest
0 голосов
/ 16 октября 2018

У меня проблемы с установкой пути файла cacerts к TrustStore в среде Linux, в Windows работает нормально.

Это проект Spring, файл cacerts находится внутри папки ресурсов, сообщаюпуть cacerts к javax.net.ssl.trustStore по коду, и я создаю файл .war с командой mvn clean package и в linux, когдаПри выполнении .war возникает ошибка при попытке подключения к серверу AD Ldap. Я считаю, что проблема заключается в том, что кодеры не найдены.

Мой код для информирования кодеров:

Path keystore = null;
try {
    keystore = Files.createTempFile(null, null);

    InputStream stream = getClass().getResourceAsStream("/cacerts");

    Files.copy(stream, keystore, StandardCopyOption.REPLACE_EXISTING);

} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

System.out.println(keystore.toString()); // print path 
System.setProperty("javax.net.ssl.trustStore", keystore.toString());

System.out.println (keystore.toString ()) показывает путь к файлу в / tmp и при проверке с помощью ls -l файлапоявляется в листинге, это какая-то проблема со средой Linux или какой-то вопрос кода, который должен работать иначе?

Отредактировано: Ошибка, которая появляется на сервере Linux:

org.springframework.ldap.CommunicationException: 172.16.0.12:636;вложенное исключение - javax.naming.CommunicationException: 172.16.0.12:636 [Исключение корня - javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: не найдено альтернативных имен субъектов, соответствующих IP-адресу 172.16.0.12]

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Что касается проблемы с IP, я смог решить ее, добавив параметр во время выполнения файла .war.

-Dcom.sun.jndi.ldap.object.disableEndpointIdentification=true
0 голосов
/ 16 октября 2018

Я думаю, что это может быть проблема с кодом.

Некоторые свойства JVM используются кодом, который запускается статической инициализацией.В этом случае свойство javax.net.ssl.trustStore используется в первый раз, когда что-то пытается получить доступ к хранилищу доверенных ключей по умолчанию или к набору доверенных сертификатов X509 по умолчанию.Неясно, когда это произойдет.

Итак, есть большая вероятность, что ваш звонок на System.setProperty происходит слишком поздно;то есть после того, как оно было использовано.

Попробуйте задать свойство с помощью параметра командной строки -Djavax.net.ssl.trustStore=... и посмотрите, работает ли оно.


ОБНОВЛЕНИЕ

Я пытался с -Djavax.net.ssl.trustStore, он не работал хорошо, потому что работал "только когда хотел", 10 попыток одна работала, примерно!Это даже из-за того, что использование -Djavax.net.ssl.trustStore может привести к задержке применения cacerts?При выполнении этого кода метод представляет собой @Bean (name = "contextSource") внутри класса @Configuration.Как я могу заставить бежать в нужное время?

По крайней мере, это показывает, что если вы используете -D, свойство устанавливается достаточно рано, чтобы быть доступным.Это доказывает, что механизм не сломан!

Теперь проблема заключается в том, что ваш пользовательский TrustStore файл используется до того, как приложение сможет его создать.(Вы можете проверить это ...)

Я предполагаю, что это инициирует веб-контейнер.Я не думаю, что вы можете заставить это работать 1 .Вместо этого вам нужно обратиться к пользовательскому требованию TrustStore другим способом:

  • Добавить отдельный шаг развертывания для извлечения пользовательского TrustStore в файл в файловой системе перед запускомвеб-контейнер .

  • В качестве альтернативы, измените веб-приложение или веб-контейнер, чтобы не полагаться на механизм TrustStore по умолчанию.

Чтобы ответить на вашследующий вопрос: насколько я могу судить, нет.Код безопасности Java не предназначен для того, чтобы можно было отложить создание экземпляра TrustStore по умолчанию или разрешить его изменение.Посмотрите на исходный код !!


1 - Даже если вы можете установить свойство до того, как веб-контейнер инициализирует и попытается использовать TrustStore, вам необходимо сначала создать TrustStore из веб-приложенияресурс.Загрузчик классов для этого ресурса создается веб-контейнером во время или после инициализации веб-контейнера.Скорее всего, это будет слишком сложно, чтобы заставить шаги надежно выполняться в том порядке, в котором они вам нужны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...