2016-03-30 14 views
0

Извините, что еще один вопрос «не удалось найти сертификат».WsImport не может найти импортный сертификат

Я развиваюсь на машине с Windows 7. Я использую несколько версий Java и из-за этого явственно о путях к используемой версии Java (здесь Java6). Я этого добиться с помощью следующих двух строк:

set path=c:\Program Files\Java\jdk1.6.0_45\bin;%path% 
set java_home=c:\Program Files\Java\jdk1.6.0_45 

Мне нужно использовать веб-службы https://service.gov/Service.svc?wsdl третьей стороной, которая предоставляет сертификат certificate.PFX (как сервис URI и файл сертификата переименованы как способ, чтобы защитить третьего участника интересы). Я убедился, что после импорта файла сертификата в Windows я могу открыть WSDL-файл в своем браузере.

я первый импортировать сертификат в моем хранилище (с помощью команды администратора Prompt, чтобы получить доступ написать в системной папке):

keytool -importkeystore -srckeystore certificate.pfx -srcstoretype pkcs12 -keystore "c:\Program Files\Java\jdk1.6.0_45\jre\lib\security\cacerts" 

Я получаю уведомление успеха. Тем не менее, я должен быть уверен, что новый сертификат присутствует на выходе:

keytool -list -keystore "c:\Program Files\Java\jdk1.6.0_45\jre\lib\security\cacerts" 

Затем я создаю новую папку, содержащую пустые подкаталоги называемых ЦСИ и классами. Как только это будет сделано, я бегу wsimport из этой новой папки (с использованием Java-класс вместо двоичном, чтобы убедиться, что я четко о доверенных сертификатов используется):

java -classpath "c:\Program Files\Java\jdk1.6.0_45\lib\tools.jar" -Djavax.net.ssl.trustStore="c:\Program Files\Java\jdk1.6.0_45\jre\lib\security\cacerts" -Djavax.net.ssl.trustStorePassword=changeit com.sun.tools.internal.ws.WsImport https://service.gov/Service.svc?wsdl -s src -d classes 

Выход следующий:

parsing WSDL... 

[ERROR] sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 

Failed to read the WSDL document: https://service.gov/Service.svc?wsdl, because 1) could not find the document; /2) the document could not be read; 3) the root element of the document is not <wsdl:definitions>. 

[ERROR] failed.noservice=Could not find wsdl:service in the provided WSDL(s): 

At least one WSDL with at least one service definition needs to be provided. 

Failed to parse the WSDL. 

Файл WSDL содержит и используется другими организациями, поэтому проблема, безусловно, не со стороны третьей стороны.

Я что-то упустил? Для меня все это сейчас кажется очевидным, но это все еще не работает. Я также пробовал это с Java8, и результат почти такой же. Единственное различие заключается в том, что в Java8 класс WsImport больше не существует, поэтому я использую двоичный файл wsimport.exe.

Заранее благодарим за любые идеи или подсказки.

ответ

1

Файл pfx (который содержит сертификат, а также закрытый ключ) предназначен для аутентификации клиента, а доверительный магазин - для проверки сертификата сервера. Важно понимать разницу между keystore и truststore.

Вы импортировали сертификат клиента (и ключ) в доверительный магазин по умолчанию (cacerts). Вместо этого вы должны:

  1. Импортировать сертификат (CA) сертификата SSL сервера в cacerts. Вы можете пропустить этот шаг, если сертификат CA уже находится в cacerts, что, вероятно, имеет место здесь.
  2. Используйте файл pfx как хранилище ключей для проверки подлинности клиента. Самый простой способ - преобразовать его в jks: https://stackoverflow.com/a/3054034/2672392 Свойства для передачи в wsimport: «javax.net.ssl.keyStore» и «javax.net.ssl.keyStorePassword».

Смотрите этот ответ для списка важных SSL свойств: https://stackoverflow.com/a/5871352/2672392

+0

Я был только при условии сертификата клиента. Как получить сертификат сервера? Я попытался получить его из браузера, когда я открываю WSDL, но он очень похож на мой клиентский сертификат, и я не могу проверить, что это не то же самое. Теперь я работаю со своей тестовой средой, поэтому очень вероятно, что сертификат выдается самостоятельно (таким образом, часть «не удалось найти действительный путь сертификации для запрашиваемой цели»). – mapto

+1

@mapto Да, вы можете просто получить сертификат сервера из браузера. На самом деле это не имеет значения, если оно самоподписано или нет. В обоих случаях вам необходимо добавить эмитента в доверительный магазин. Если он самоподписан, эмитент является самим сертификатом. – Omikron

+0

При отладке этого также был полезен заглушка TrustManager, предоставленная в этой ссылке (https://gist.github.com/michalbcz/4170520). Тем не менее, это уязвимость системы безопасности для использования в производственной среде. – mapto