импортировал certificate.pfx в cacerts и по-прежнему получает PKIXunable, чтобы найти действительный путь сертификации к запрошенной целевой ошибке. Что?

Я написал клиент веб-сервиса и теперь не могу запустить его через https. Хотя я импортировал cert.pfx(alias=cert) в javas cacerts и успешно добавил запись с псевдонимом сертификатов.

Тем не менее я не могу использовать приглашение wsimport для URL-адреса wsdl. Пишет: Не удалось построить путь PKIX, не удалось найти допустимый путь сертификации к запрошенной цели. Ну ладно. Поэтому я немного исследовал и попытался установить его с помощью

setlocal set _JAVA_OPTIONS=%_JAVA_OPTIONS%
-Djavax.net.ssl.trustStore="C:\Program Files\Java\jdk1.7.0_79\jre\lib\security\cacerts"
-Djavax.net.ssl.trustStorePassword=changeit -Djavax.net.ssl.keyStoreType=PKCS12 -Djavax.net.ssl.keyStorePassword=xxxxxxxxx -Djavax.net.ssl.keyStore="d:\cert.pfx" "C:\Program Files\Java\jdk1.7.0_79\bin\wsimport" -s C:\Users\me\keystore\bin\s
-keep https://service.xxxxxxxxxxx.de/xxxxxxxxxxxxTest?wsdl endlocal

безуспешно.

Я также попытался экспортировать сертификат из файла cert.pfx, а затем импортировать сертификат в cacerts с помощью keytool -exportcert и keytool -importcert. Позже я попытался экспортировать сертификаты из своего браузера (потому что мой браузер отлично обрабатывает сертификаты и может получить доступ к URL-адресу https). Я экспортировал корневой сертификат в файл root.cer и импортировал этот .cer в свои cacerts (мне пришлось использовать псевдоним, отличный от сертификата. С сертификатом в качестве псевдонима я получил сообщение «Ключи не совпадают» в консоли при использовании приглашения keytool) .

Дамп на cacerts показывает, что запись в cacerts действительно есть. Я не понимаю, почему java отказывается выполнять wsimport для URL-адреса.

В конце концов, я просто загрузил URL-адрес назначения на свою машину и сделал wsimport для загруженного .xml-файла, а затем изменил параметры URL-адреса в сгенерированных заглушках. Однако это не помогает, потому что, когда я запускаю приложение, я запускаю PKIX... не могу найти действительный путь сертификации для запрошенной целевой ошибки.


person Poly Morph    schedule 09.07.2015    source источник
comment
Это веб-сервисы, которые требуют аутентификации клиента? Какое хранилище ключей вы используете с параметром -Djavax.net.ssl.keyStore? Кроме того, вы пытались получить цепочку сертификатов сервера с помощью инструмента командной строки openSSL?   -  person Francois Gergaud    schedule 09.07.2015
comment
Я попробую предложение openSSL. Также какое хранилище ключей я должен использовать с djavax.net.ssl.keystore. Я использовал файл cert.pfx. Я также пытался не указывать его и использовать только хранилище доверенных сертификатов -Djavax.net.ssl.trustStore=путь к моим cacerts. Однако не является ли это излишним? Разве я не должен использовать переменные среды, когда я хочу, чтобы java явно загружала что-то еще, кроме своих cacerts?   -  person Poly Morph    schedule 10.07.2015
comment
У меня есть что запустить. Я экспортировал корневой сертификат из хром-браузера (щелкните правой кнопкой мыши в браузере и выберите «Показать информацию о сайте» -> «Подключения» -> «Показать сертификаты» -> «Правая регистрационная карта» (выбрать корневой сертификат) -> «Средняя регистрационная карта» -> «Копировать в файл» -> «Создать .cer»). файл), затем я импортировал его в cacerts. После этого я смог выполнить wsimport на wsdl-url, а также запустить свой клиент на сервере (хотя я получил ошибки тайм-аута http)   -  person Poly Morph    schedule 10.07.2015
comment
отличный! хранилище ключей используется для того, чтобы вызывающая сторона (клиент в вашем случае) отправляла сертификат для идентификации себя. Если серверу не требуется SSL-аутентификация клиента, клиенту не нужно использовать хранилище ключей. Хранилище доверенных сертификатов используется вызывающей стороной (клиентом в вашем случае), чтобы доверять вызываемому объекту (серверу в вашем случае). Для простого соединения SSL без аутентификации клиента на стороне клиента следует использовать только хранилище доверенных сертификатов. cacerts используется JVM во время запуска, если параметр -Djavax.net.ssl.trustStore не указан. Так что указывать его на ваш cacert излишне.   -  person Francois Gergaud    schedule 10.07.2015


Ответы (1)


Вам также необходимо импортировать сертификат *.der в хранилище ключей, прежде чем пытаться изменить параметры jvm.

Вот общий обзор того, как импортировать сертификаты, чтобы исправить следующую ошибку:

Ошибка при попытке выполнить запрос. javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: сбой построения пути PKIX: sun.security.provider.certpath.SunCertPathBuilderException: невозможно найти допустимый путь сертификации к запрошенной цели

Как импортировать сертификаты

  1. Go to URL in your browser, click on HTTPS certificate chain (little lock symbol next to URL address) to export the certificate
    • Click "more info" > "security" > "show certificate" > "details" > "export..".
    • Сохранить как .der
    • Повторите для всех сертификатов, которые необходимо импортировать.
  2. Найдите $JAVA_HOME/jre/lib/security/cacerts.
  3. Импортируйте все файлы *.der в файл cacerts, используя следующее:

    sudo keytool -import -alias mysitestaging -keystore $JAVA_HOME/jre/lib/security/cacerts -file staging.der
    sudo keytool -import -alias mysiteprod -keystore  $JAVA_HOME/jre/lib/security/cacerts -file prod.der
    sudo keytool -import -alias mysitedev -keystore  $JAVA_HOME/jre/lib/security/cacerts -file dev.der
    
  4. Пароль хранилища ключей по умолчанию – 'changeit'.

  5. Вы можете просмотреть изменения, внесенные с помощью этой команды, которая показывает отпечаток сертификата.

    keytool -list -keystore $JAVA_HOME/jre/lib/security/cacerts
    
  6. Если это не решит проблему, попробуйте добавить эти параметры Java в качестве аргументов:

    -Djavax.net.ssl.trustStore="$JAVA_HOME/jre/lib/security/cacerts"
    -Djavax.net.ssl.trustStorePassword="changeit"
    
person Katie    schedule 18.10.2016