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 в своем браузере.
Сначала я импортирую сертификат в хранилище ключей (используя командную строку администратора, чтобы получить доступ для записи в системную папку):
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"
Затем я создаю новую папку, содержащую пустые подпапки с именем src и classes. Как только это будет сделано, я запускаю 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 (который содержит сертификат, а также закрытый ключ) предназначен для аутентификации клиента, а склад доверенных сертификатов - для проверки сертификата сервера. Важно понимать разницу между хранилищем ключей и хранилищем доверенных сертификатов.
Вы импортировали сертификат клиента (и ключ) в хранилище доверенных сертификатов по умолчанию (cacerts). Что вы должны были сделать вместо этого:
- Импортируйте эмитент (CA) SSL-сертификата сервера в cacerts. Вы можете пропустить этот шаг, если сертификат CA уже находится в cacerts, что, вероятно, имеет место здесь.
- Используйте файл pfx в качестве хранилища ключей для аутентификации клиента. Самый простой способ - преобразовать его в jks: /questions/13482946/preobrazovaniejks-v-p12/13482967#13482967 Свойства, которые нужно передать в wsimport: "
javax.net.ssl.keyStore
" а также "javax.net.ssl.keyStorePassword
".
См. Этот ответ для получения списка важных свойств SSL: /questions/2221768/hranilische-klyuchej-ssl-i-sertifikatov-java/2221789#2221789