Запросить в хранилище доверенных сертификатов jvm и файл jssecacerts? - PullRequest
3 голосов
/ 24 марта 2012

У меня есть два веб-приложения https: app1 и app2, установленные на двух разных tomcats t1 и t2 (t1 и t2 на разных машинах).когда в app1 я устанавливаю соединение URL с app2, я получаю ошибку рукопожатия SSL.Причина в том, что я использую самоподписанный сертификат в app2, которого нет в app1 jvm truststore.Поэтому, чтобы исправить это, установите самоподписанный сертификат в JAVA-HOME / jre / lib / security.Чтобы сделать то же самое, я следовал инструкциям, приведенным на http://www.mkyong.com/webservices/jax-ws/suncertpathbuilderexception-unable-to-find-valid-certification-path-to-requested-target/. Для разных форумов предлагаются одни и те же шаги.Но все же я получаю ту же ошибку рукопожатия SSL, которая является

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
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)

Хотя я избавился от этого исключения SSLHandshakeException, упомянув ниже параметры в опеке JVM.-Djavax.net.ssl.trustStore = C: .keystore -Djavax.net.ssl.trustStorePassword = changeit

Мой вопрос здесь, почему первый подход (который является правильным подходом), т.е. размещение файла jssecacertsв / lib / security не работает? Еще один вопрос: чем отличается первый и второй подход?

Ответы [ 2 ]

6 голосов
/ 24 марта 2012

Несмотря на то, что я избавился от этого исключения SSLHandshake, упомянув ниже параметры в JVM trustore.-Djavax.net.ssl.trustStore = C: .keystore -Djavax.net.ssl.trustStorePassword = changeit

Не ясно, что вы пытались сделать с этими параметрами.Либо вы используете хранилище доверенных сертификатов по умолчанию (обычно jssecacerts, если оно существует; в противном случае cacerts), либо вы указываете свое собственное..keystore имеет тенденцию использоваться в качестве хранилища ключей, а не хранилища доверенных сертификатов (хотя по умолчанию значение JSSE отсутствует).(Кстати, я бы также указал полный путь вместо C:.keystore.)

Вероятно, лучше сделать копию исходного файла cacerts (или jssecacerts) (удалите дополнительныйвы положили, если вы что-то изменили) и добавили в него свой удаленный сертификат (т. е. сертификат app2 в копии app1 и сертификат app1 в копии app2, если необходимо).

Вы можете перечислить сертификаты, используя keytool -list -keystore keystore.jks (см. В справке дополнительные параметры, если это необходимо).

Вы можете экспортировать сертификат, используя keytool -export -keystore server1-keystore.jks -alias server_alias -file server1.crt.

Затем импортируйте его в другое хранилище доверенных сертификатов: keytool -import -keystore client2-truststore.jks -file server1.crt.(Здесь client2-truststore.jks будет копией cacerts.) Затем настройте JVM, работающую под управлением Apache Tomcat (не обязательно соединитель Tomcat), чтобы использовать его.Вы должны иметь возможность установить параметры JVM в catalina.sh (JAVA_OPTS=-D...).

РЕДАКТИРОВАТЬ:

Мой вопрос здесь, почему первый подход (что является правильным подходом) то есть помещение файла jssecacerts в / lib / security не работает?

Чтобы ответить на ваш вопрос более прямо, я просто дважды проверил чистую установку Oracle JRE 6 (1.6.0_31), и jssecacerts имеет приоритет над cacerts, когда присутствует (как описано в Руководстве по JSSE Ref, поэтому, похоже, ошибки нет).Я не уверен, куда Oracle переместил блог Андреаса Стербенса в Sun, поэтому я не уверен, какую копию InstallCert вы использовали.Я думаю, что-то там пошло не так.

Насколько я знаю, InstallCert подключается к серверу, чтобы получить свой сертификат (заменяя шаг экспорта выше): вы фактически предполагаете, что сертификат вы получаетена вашем первом соединении является правильным (и можно доверять).Вы также можете получить этот сертификат , используя OpenSSL .Однако в вашем случае вы, кажется, имеете контроль над двумя серверами и их соответствующими хранилищами ключей, так что вы можете также использовать keytool -export, чтобы быть уверенным.

Другой момент заключается в том, что отличается между первыми второй подход?

Первый подход (изменение jssecacerts) задает конфигурацию для всех приложений, которые будут использовать эту установку JRE, тогда как второй будет применять эти настройки к JVM после его запускаТолько Apache Tomcat.

Обратите внимание, что если у вас не было jssecacerts, а только cacerts файла, если вы только импортировали свой сертификат в jssecacerts, cacerts будет игнорироваться, поэтомувы не сможете подключиться к серверам, у которых есть сертификат, выданный ЦС, который по умолчанию обычно является доверенным.Вот почему начинать с копии файла по умолчанию может быть полезно.(Кроме того, если ваше приложение также подключается к другим сайтам, которые обычно бывают доверенными по умолчанию, это также может объяснить, почему вы получите это сообщение об ошибке, в этот раз в другом месте.)

В конечном счете, Вы обязаны проверить, что находится в jssecacerts или cacerts:

ВАЖНОЕ ПРИМЕЧАНИЕ: JDK поставляется с ограниченным количеством доверенных корневых сертификатов в / lib / security /файл cacerts.Как описано в keytool, вы несете ответственность за поддержание (то есть добавление / удаление) сертификатов, содержащихся в этом файле, если вы используете этот файл в качестве хранилища доверенных сертификатов.

В зависимости от конфигурации сертификатов серверов, к которым вы обращаетесьВам может потребоваться добавить дополнительные корневые сертификаты.Получите необходимые конкретные корневые сертификаты от соответствующего поставщика.

0 голосов
/ 24 марта 2012

Разница в том, что вы добавили сертификат в неверный файл склада доверенных сертификатов :).Системный файл склада доверенных сертификатов JRE не является jssecacerts, а просто запускается в каталоге $ {JRE_HOME} / lib / security /.Вы создавали новый траст, о котором JRE не знает.Добавление сертификата в соответствующий магазин решит вашу проблему.Однако позвольте мне предупредить вас, что не стоит добавлять ваши собственные сертификаты CA в склад доверенных сертификатов системы.Добавьте их в хранилище доверенных сертификатов пользователя и используйте его так же, как во втором варианте.

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