Извините, что еще один вопрос «не удалось найти сертификат».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.
Заранее благодарим за любые идеи или подсказки.
Я был только при условии сертификата клиента. Как получить сертификат сервера? Я попытался получить его из браузера, когда я открываю WSDL, но он очень похож на мой клиентский сертификат, и я не могу проверить, что это не то же самое. Теперь я работаю со своей тестовой средой, поэтому очень вероятно, что сертификат выдается самостоятельно (таким образом, часть «не удалось найти действительный путь сертификации для запрашиваемой цели»). – mapto
@mapto Да, вы можете просто получить сертификат сервера из браузера. На самом деле это не имеет значения, если оно самоподписано или нет. В обоих случаях вам необходимо добавить эмитента в доверительный магазин. Если он самоподписан, эмитент является самим сертификатом. – Omikron
При отладке этого также был полезен заглушка TrustManager, предоставленная в этой ссылке (https://gist.github.com/michalbcz/4170520). Тем не менее, это уязвимость системы безопасности для использования в производственной среде. – mapto