Как решить javax. net. ssl. SSLHandshakeException ошибку?
Я подключился к VPN, чтобы настроить инвентаризационный API, чтобы получить список продуктов, и он работает нормально. Как только я получаю результат от веб-сервиса и привязываюсь к UI. А также я интегрировал 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
6 ответов:
Сначала вам нужно получить открытый сертификат от сервера, к которому вы пытаетесь подключиться. Это можно сделать различными способами, например, связаться с администратором сервера и запросить его, с помощью openssl загрузить его, или, поскольку это, по-видимому, HTTP-сервер, подключиться к нему с помощью любого браузера, просмотреть информацию о безопасности страницы и сохранить копию сертификата. (Google должен быть в состоянии точно сказать вам, что делать для вашего конкретного браузера.)
Теперь, когда у вас есть сертификат, сохраненный в файле, необходимо добавить в хранилище доверия вашего JVM. В
$JAVA_HOME/jre/lib/security/для JREs или$JAVA_HOME/lib/securityдля JDKs есть файл с именемcacerts, который поставляется с Java и содержит открытые сертификаты известных сертификационных органов. Чтобы импортировать новый сертификат, запустите keytool от имени пользователя, имеющего разрешение на запись в cacerts:keytool -import -file <the cert file> -alias <some meaningful name> -keystore <path to cacerts file>Скорее всего, он запросит у вас пароль. Пароль по умолчанию, поставляемый с java, -
changeit. Его почти никто не меняет. После того, как вы выполните их относительно простые шаги, вы будете общаться безопасно и с уверенностью, что вы говорите с правильным сервером и только с правильным сервером (до тех пор, пока они не потеряют свой закрытый ключ).
Теперь я решил эту проблему таким образом,
Конечно, это решение должно использоваться только в сценариях, где невозможно установить требуемые сертификаты, используяimport javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import java.io.OutputStream; // Create a trust manager that does not validate certificate chains like the default TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) { //No need to implement. } public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) { //No need to implement. } } }; // Install the all-trusting trust manager try { SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, trustAllCerts, new java.security.SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); } catch (Exception e) { System.out.println(e); }keytool, например, локальное тестирование с временными сертификатами.
Всякий раз, когда мы пытаемся подключиться к URL,
Если сервер на другом сайте работает по протоколу https и требует, чтобы мы общались через информацию, предоставленную в сертификате, то у нас есть следующий вариант:
1) запросите сертификат (загрузите сертификат), импортируйте этот сертификат в trustore. Trustore по умолчанию Java использует можно найти в \в Java\jdk1.6.0_29\среда jre\lib в\безопасность\cacerts в, то если мы будем пытаться подключиться к URL-адрес подключения будет принято.
2) в обычных бизнес-случаях мы можем подключаться к внутренним URL-адресам в организациях, и мы знаем, что они верны. В таких случаях вы уверены, что это правильный URL, в таких случаях выше, код может быть использован, который не будет предписывать хранить сертификат для подключения к конкретному URL.
Для пункта № 2 мы должны выполнить следующие шаги:
1) напишите ниже метод, который устанавливает HostnameVerifier для HttpsURLConnection, который возвращает true для всех случаев, означающих, что мы доверяем trustStore.
// trusting all certificate public void doTrustToCertificates() throws Exception { Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { public X509Certificate[] getAcceptedIssuers() { return null; } public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException { return; } public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException { return; } } }; SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, trustAllCerts, new SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); HostnameVerifier hv = new HostnameVerifier() { public boolean verify(String urlHostName, SSLSession session) { if (!urlHostName.equalsIgnoreCase(session.getPeerHost())) { System.out.println("Warning: URL host '" + urlHostName + "' is different to SSLSession host '" + session.getPeerHost() + "'."); } return true; } }; HttpsURLConnection.setDefaultHostnameVerifier(hv); }2) Напишите ниже метод, который вызывает doTrustToCertificates перед попыткой подключиться к URL
// connecting to URL public void connectToUrl(){ doTrustToCertificates();// URL url = new URL("https://www.example.com"); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); System.out.println("ResponseCode ="+conn.getResponseCode()); }Этот вызов вернет код ответа = 200 означает, что соединение успешно.
Для получения более подробной информации и примера вы можете обратиться к URL .
Я полагаю, что вы пытаетесь подключиться к чему-то с помощью SSL, но это что-то предоставляет сертификат, который не проверяется корневыми центрами сертификации, такими как verisign.. По сути, по умолчанию безопасные соединения могут быть установлены только в том случае, если лицо, пытающееся подключиться, знает ключи контрагентов или какой-либо другой верндор, такой как verisign, может вмешаться и сказать, что предоставляемый открытый ключ действительно правильный..
Все ОС доверяют горстке сертификационных центров и более мелкие эмитенты сертификатов должны быть сертифицированы одним из крупных сертифицирующих компаний, создающих цепочку сертифицирующих компаний, если вы понимаете, что я имею в виду...
В любом случае возвращаясь к сути.. У меня была похожая проблема при программировании Java-апплета и java-сервера ( надеюсь, когда-нибудь я напишу полный блог о том, как я получил всю безопасность для работы:))
По сути, мне нужно было извлечь открытые ключи из сервера и сохранить их в хранилище ключей внутри моего апплета, а когда Я подключился к серверу, который использовал это хранилище ключей для создания фабрики доверия, а эту фабрику доверия-для создания ssl-соединения. Существуют также процедуры alterante, такие как добавление ключа к доверенному хосту JVM и изменение хранилища доверия по умолчанию при запуске..
Я сделал это около двух месяцев назад, и сейчас у меня нет исходного кода.. используйте google, и вы сможете решить эту проблему. Если вы не можете отправить мне ответное сообщение, и я могу предоставить вам соответствующий исходный код для проект.. Не знаю, решит ли это вашу проблему, так как вы не предоставили код, который вызывает эти исключения. Кроме того, я работал с апплетами, думал, что не могу понять, почему это не работает на серверах...P. S Я не могу получить исходный код до выходных, так как внешний SSH отключен в моем офисе : (
SSLHandshakeException можно разрешить 2 способами.
Включение SSL
Получить SSL (запросив у системного администратора исходный код, можно также быть загружены командой openssl, или любые браузеры загружает сертификаты)
Добавьте сертификат в truststore (cacerts), расположенный по адресу JRE / lib / security
Местоположение надежное хранилище в параметры VM как "-Djavax.чистая.протокол SSL.надежное хранилище="
Игнорирование SSL
Для этого #2, пожалуйста, посетите мой другой ответ на другом сайте stackoverflow: Как включить проверку SSL игнорировать ошибки SSL сертификата с Java
Теперь я решил эту проблему таким образом,
import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import java.io.OutputStream; // Create a trust manager that does not validate certificate chains like the default TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) { //No need to implement. } public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) { //No need to implement. } } }; // Install the all-trusting trust manager try { SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, trustAllCerts, new java.security.SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); } catch (Exception e) { System.out.println(e); }
Comments