Добавление других сертификатов к существующим jks или неиспользование javax.net.ssl.truststore для запроса

Я запускаю приложение Spring под Tomcat в Linux. Я использую mongodb в качестве службы базы данных.

После долгих поисков, чтобы найти, как использовать SSL / TLS для подключения к mongodb, я обнаружил, что мне нужно добавить сертификаты в хранилище ключей Java и использовать их в моем весеннем приложении, как это.

System.setProperty("javax.net.ssl.trustStore","/path/truststore.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "apass");
System.setProperty("javax.net.ssl.keyStore", "/path/keystore.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "apass");
System.setProperty("javax.security.auth.useSubjectCredsOnly","false");

и все работало нормально, и я мог подключиться к mongodb. Но проблема в том, что я отправляю другие HTTP-запросы из своего приложения с помощью Spring RestTemplate. После того, как я настроил свой mongodb с помощью SSL, я не могу подключиться к любому другому внешнему хосту.

PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target; nested exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Я создал свои сертификаты SSL, используя этот ТАК ответ. И я использовал keytools, как описано здесь.

Я не являюсь экспертом в использовании keyTools или Key manager, и раньше у меня не было такого опыта с ssl.

ОБНОВИТЬ Даже после удаления свойств очистки или даже выключения системы я все равно получаю то же исключение. Это похоже на то, что соединение все еще пытается использовать неправильный сертификат ssl.

1
0
1 460
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Что вы сделали, так это создали настраиваемое хранилище доверенных сертификатов, которое заменяет хранилище, предоставляемое JVM, и ваше хранилище не содержит всех известных сертификатов CA, используемых общедоступными интернет-службами. Следовательно, вы получаете ошибки доверительного пути, когда ваша сторона пытается проверить сертификат вне Интернета.

Самый быстрый обходной путь для вас - установить нет свойства javax.net.ssl.trustStore и javax.net.ssl.trustStorePassword. Вместо этого импортируйте сертификат CA mongodb в хранилище доверенных сертификатов JVM по умолчанию (обычно это файл cacerts). Вам нужно будет не забыть повторить это, если вы заменяете / обновляете JVM.

Если у вас нет необходимых разрешений для изменения cacerts или вы находитесь на общем сервере, где это запрещено, вы все равно можете использовать свое настраиваемое хранилище доверенных сертификатов, но дополнить его всеми известными сертификатами в файле cacerts. Вы будете нести ответственность за его обслуживание по мере появления новых сертификатов ЦС.

Звучит, чтобы поступить правильно. Я это протестирую. а что случилось с другими моими сертификатами? Почему мое приложение больше не может подключаться к другим серверам через HTTPS? Я имею в виду, что старые сертификаты должны быть там.

Sep GH 12.04.2018 11:47

Не обращайте внимания на вопрос в моем предыдущем комментарии. Я обнаружил, что испортил имя хоста linux.

Sep GH 12.04.2018 12:05

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