Я подключился к VPN, чтобы настроить API инвентаризации, чтобы получить список продуктов, и он отлично работает. Как только я получаю результат от веб-службы и привязываюсь к пользовательскому интерфейсу. А также я интегрировал PayPal со своим приложением для экспресс-оплаты, когда я звоню для оплаты, я сталкиваюсь с этой ошибкой. Я использую сервлет для внутреннего процесса. Кто-нибудь может сказать, как решить эту проблему?
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException:
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target
Ответы:
Во-первых, вам нужно получить общедоступный сертификат с сервера, к которому вы пытаетесь подключиться. Это можно сделать разными способами, например, связаться с администратором сервера и запросить его, использовать OpenSSL для его загрузки или, поскольку это выглядит как HTTP-сервер, подключиться к нему с помощью любого браузера, просмотреть информацию о безопасности страницы. и сохранение копии сертификата. (Google должен точно сказать вам, что делать для вашего конкретного браузера.)
Теперь, когда у вас есть сертификат, сохраненный в файле, вам нужно добавить его в хранилище доверенных сертификатов JVM. В
$JAVA_HOME/jre/lib/security/
течение JREs или$JAVA_HOME/lib/security
для JDKs, есть файл с именемcacerts
, который поставляется с Java и содержит открытые сертификаты известных органов по сертификации. Чтобы импортировать новый сертификат, запустите keytool от имени пользователя, у которого есть разрешение на запись в cacerts:Скорее всего, он попросит вас ввести пароль. Пароль по умолчанию, поставляемый с Java, -
changeit
. Его почти никто не меняет. После того, как вы выполните эти относительно простые шаги, вы будете общаться безопасно и с уверенностью, что разговариваете с правильным сервером и только с правильным сервером (если они не потеряют свой закрытый ключ).источник
Теперь я решил эту проблему таким образом,
Конечно, это решение следует использовать только в сценариях, где невозможно установить требуемые сертификаты,
keytool
например, с помощью локального тестирования с временными сертификатами.источник
Каждый раз, когда мы пытаемся подключиться к URL,
Если сервер на другом сайте работает по протоколу https и требует, чтобы мы общались через информацию, указанную в сертификате, у нас есть следующий вариант:
1) запросить сертификат (скачать сертификат), импортировать этот сертификат в трусторе. Использование java trustore по умолчанию можно найти в \ Java \ jdk1.6.0_29 \ jre \ lib \ security \ cacerts, тогда, если мы попытаемся подключиться к URL-адресу, соединение будет принято.
2) В обычных бизнес-случаях мы можем подключаться к внутренним URL-адресам в организациях и знаем, что они верны. В таких случаях вы уверены, что это правильный URL-адрес. В таких случаях, описанных выше, может использоваться код, который не требует сохранения сертификата для подключения к определенному URL-адресу.
для пункта 2 мы должны выполнить следующие шаги:
1) напишите ниже метод, который устанавливает HostnameVerifier для HttpsURLConnection, который возвращает true для всех случаев, что означает, что мы доверяем trustStore.
2) напишите ниже метод, который вызывает doTrustToCertificates перед попыткой подключения к URL-адресу
Этот вызов вернет код ответа = 200 означает, что соединение успешно.
Для получения более подробной информации и примера вы можете обратиться к URL .
источник
SSLHandshakeException можно разрешить двумя способами.
Включение SSL
Получите SSL (запросив системного администратора источника, также можно загрузить с помощью команды openssl, или любой браузер загрузит сертификаты)
Добавьте сертификат в хранилище доверенных сертификатов (cacerts), которое находится в JRE / lib / security.
укажите расположение доверенного хранилища в аргументах виртуальной машины как "-Djavax.net.ssl.trustStore ="
Игнорирование SSL
Для этого # 2, пожалуйста, посетите мой другой ответ на другом веб-сайте stackoverflow: Как пройти проверку SSL Игнорировать ошибки сертификата SSL с помощью Java
источник
Я считаю, что вы пытаетесь подключиться к чему-то с помощью SSL, но что-то предоставляет сертификат, который не проверяется корневыми центрами сертификации, такими как verisign .. По сути, по умолчанию безопасные соединения могут быть установлены только в том случае, если человек, пытающийся подключиться, знает ключи контрагентов или другой поставщик, такой как verisign, могут вмешаться и сказать, что предоставленный открытый ключ действительно правильный.
ВСЕ ОС доверяют горстке центров сертификации и более мелких издателей сертификатов, которые должны быть сертифицированы одним из крупных центров сертификации, составляющих цепочку сертификаторов, если вы понимаете, о чем я ...
В любом случае, возвращаясь к сути ... У меня была похожая проблема при программировании java-апплета и java-сервера (надеюсь, когда-нибудь я напишу полный пост в блоге о том, как я заставил всю безопасность работать :))
По сути, мне нужно было извлечь открытые ключи с сервера и сохранить их в хранилище ключей внутри моего апплета, и когда я подключился к серверу, я использовал это хранилище ключей для создания фабрики доверия и эту фабрику доверия для создания ssl подключение. Также существуют альтернативные процедуры, такие как добавление ключа к доверенному узлу JVM и изменение хранилища доверенных сертификатов по умолчанию при запуске.
Я сделал это около двух месяцев назад, и прямо сейчас у меня нет исходного кода ... используйте Google, и вы сможете решить эту проблему. Если вы не можете отправить мне ответ, и я могу предоставить вам соответствующий исходный код для проекта .. Не знаю, решит ли это вашу проблему, поскольку вы не предоставили код, вызывающий эти исключения. Кроме того, я работал с апплетами, и думал, что не понимаю, почему они не работают на серверлетах ...
PS Я не могу получить исходный код до выходных, так как у меня в офисе отключен внешний SSH :(
источник
Теперь я решил эту проблему таким образом,
источник