Использовать сертификат для запроса HTTPS в Java - PullRequest
0 голосов
/ 30 мая 2018

Я хочу вызывать некоторые веб-сервисы через соединение HTTPS в Java.Центр сертификации дал мне файл PKCS12, но я получил

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

из-за

javax.net.ssl.SSLHandshakeException

Вот код, который я выполняю:

System.setProperty("javax.net.ssl.keyStoreType", "JKS");
System.setProperty("javax.net.ssl.keyStore", "path/toto2.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "pwd");
System.setProperty("javax.net.ssl.trustStoreType", "JKS");
System.setProperty("javax.net.ssl.trustStore", "path/toto2.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "pwd");
System.setProperty("proxySet","true") ;
System.setProperty("https.proxyHost", "XXX") ;
System.setProperty("https.proxyPort", "XXX") ;

Iсначала попытался выдать файл PKCS12, затем JKS, но у меня возникла та же ошибка.

Я попробовал другое решение с curl.Поэтому я извлек сертификаты из PKCS12 и успешно обработал запросы.

Вот команды, которые я использовал для извлечения различных файлов из P12:

openssl pkcs12 -in file.p12 -nocerts -nodes -out clientcert.key
openssl pkcs12 -in file.p12 -clcerts -nokeys -out clientcert.cer
openssl pkcs12 -in file.p12 -cacerts -nokeys -chain -out cacerts.cer

Я ошибаюсь в том, как яиспользовать эти файлы в Java?

1 Ответ

0 голосов
/ 30 мая 2018

PKCS12 обычно содержит комбинацию приватного ключа и сертификата (цепочки) и используется для аутентификации вашей системы , то есть клиента, что выполняется со свойствами javax.net.ssl.keyStore*.Вы должны указать тип PKCS12, хотя некоторые версии Java8 (только!) Могут читать PKCS12 при указании JKS.

Как правило, он НЕ аутентифицирует сервер (ы), для чего предназначен javax.net.ssl.trustStore*, поэтому не используйте его там.В зависимости от сервера (ов), вам может понадобиться или не потребоваться пользовательское хранилище доверенных сертификатов, отличное от P12, а также отличающееся от Java по умолчанию.Посмотрите цепочку сертификатов, используемую сервером с помощью браузера или другого инструмента, такого как curl или keytool -printcert -sslserver host[:port], и определите, использует ли он общедоступный корневой центр сертификации, такой как Verisign-now-Symantec-now-Digicert или GoDaddy, который уже будет вСклад доверенных сертификатов по умолчанию в Java, или «частный» ЦС, или даже самозаверяющий сертификат, в этом случае вы должны либо добавить этот сертификат в хранилище доверенных сертификатов по умолчанию, либо, если вы не можете или не хотите изменять свою JVM, вставьте этот сертификат вфайл хранилища ключей, который вы используете в качестве хранилища доверенных сертификатов.

PS: ValidatorException вызывает SSLHandshakeException, а не наоборот.

...