Как решить ошибку javax.net.ssl.SSLHandshakeException?

Я подключился к VPN для настройки API инвентаризации, чтобы получить список продуктов, и он отлично работает. Как только я получаю результат от веб-сервиса, и я привязываюсь к пользовательскому интерфейсу. А также я интегрировал PayPal с моим приложением для совершения express-проверки, когда я делаю звонок для оплаты. Я столкнулся с этой ошибкой. Я использую сервлет для внутреннего процесса. Может ли кто-нибудь сказать, как решить эту проблему?

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 

Сначала вам нужно получить общеansible сертификат с сервера, к которому вы пытаетесь подключиться. Это можно сделать различными способами, например, связаться с администратором сервера и запросить его, используя openssl для его загрузки или, поскольку это, как представляется, HTTP-сервер, подключающийся к нему с любым браузером, просматривая информацию о безопасности страницы , и сохранение копии сертификата. (Google должен быть в состоянии точно сказать, что делать для вашего конкретного браузера.)

Теперь, когда у вас есть сертификат, сохраненный в файле, вам нужно добавить его в хранилище доверия JVM. В $JAVA_HOME/jre/lib/security/ для JRE или $JAVA_HOME/lib/security для JDK существует файл cacerts , который поставляется с Java и содержит общедоступные сертификаты известных сертифицирующих органов. Чтобы импортировать новый сертификат, запустите keytool как пользователь, у которого есть разрешение на запись в cacerts:

 keytool -import -file  -alias  -keystore  

Скорее всего, он попросит вас ввести пароль. Пароль по умолчанию, поставляемый с 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) запросить сертификат (загрузить сертификат), импортировать этот сертификат в доверенность. Использованные по умолчанию функции доверия по умолчанию для java можно найти в \ Java \ jdk1.6.0_29 \ jre \ lib \ security \ 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, могут вмешаться и сказать, что предоставленный публичный ключ действительно прав.

Одобрение ALL OS несколько авторитетных сертификационных центров и небольших эмитентов сертификатов должно быть сертифицировано одним из крупных сертификаторов, создающих цепочку сертификаторов, если вы понимаете, что я имею в виду …

В любом случае вернемся к делу. У меня была аналогичная проблема при программировании java-апплета и java-сервера (надеюсь, когда-нибудь я напишу полный блог-блог о том, как я получил всю безопасность для работы :))

В сущности, мне нужно было извлечь открытые ключи с сервера и сохранить их в хранилище ключей внутри моего апплета, и когда я подключился к серверу, я использовал этот хранилище ключей для создания фабрики доверия и что фабрика доверия создала ssl подключение. Существуют также альтернативные процедуры, такие как добавление ключа к доверенному хосту JVM и изменение хранилища доверия по умолчанию при запуске.

Я сделал это примерно два месяца назад и не имею исходного кода для меня прямо сейчас. Используйте Google, и вы должны решить эту проблему. Если вы не можете передать мне сообщение, и я могу предоставить вам соответствующий исходный код для проекта. Не знаете, решает ли эта проблема вашу проблему, поскольку вы не предоставили код, который вызывает эти исключения. Кроме того, я работал с апплетами, я думал, что не могу понять, почему это не будет работать на Serverlets …

PS Я не могу получить исходный код до выходных, поскольку внешний SSH отключен в моем офисе 🙁

SSLHandshakeException можно решить двумя способами.

  1. Включение SSL

    • Получить SSL (попросив администратора системного администратора, также можно загрузить с помощью команды openssl, или любые браузеры загружают сертификаты)

    • Добавьте сертификат в truststore (cacerts), расположенный в JRE / lib / security

    • укажите местоположение доверия в аргументах vm как «-Djavax.net.ssl.trustStore =”

  2. Игнорирование 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); } 
  • Как свести кран на eth0 на малиновый пи?
  • Как принудительно разбить туннель на Mac на Cisco VPN
  • Зачем использовать VPN-соединение?
  • Маршрутизация трафика IPv6 через pptpd Debian в туннель IPv6 Hurricane Electric
  • Как подключиться к VPN при запуске?
  • Как запустить звездочку за VPN?
  • Как настроить простой VPN для безопасного подключения к Интернету через незашифрованный Wi-Fi?
  • Как записывать трафик, который находится внутри VPN?
  • Как создать ярлык для VPN-соединения?
  • SSH-сервер не может быть подключен, когда VPN включен
  • Как защитить соединение PPTP - Windows 7?
  • Давайте будем гением компьютера.