Брось исключение SSLHandshakeException при попытке подключиться к серверу https с помощью Java

Я пытался извлечь данные из «https://api.softtouch.eu/#/xxxxxxxx/#/customers?take=100«используя Java.

Также я попытался решить проблему с https, используя следующие параметры: —

  1. Добавлен сертификат (файл расширения .pem) в хранилище ключей ($ JAVA_HOME / jre / lib / security / cacerts) с использованием Java keytool

  2. Добавлен центр сертификации в Ubuntu (/ usr / local / share / ca-сертификаты) с помощью команды update-ca-Certificates.

  3. Наконец попытался отключить проверку сертификата и подключиться к серверу. (Класс SoftTouchConnection и пользовательский класс TrustAllX509TrustManager здесь.)

    package com.softtouch.com;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.net.URL;
    import java.security.Security;
    
    import javax.net.ssl.HostnameVerifier;
    import javax.net.ssl.HttpsURLConnection;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLSession;
    import javax.net.ssl.TrustManager;
    
    import org.apache.commons.codec.binary.Base64;
    
    public class SoftTouchConnection {
    public static void main(String[] args) {
    try {
    
    System.out.println(System.getProperty("java.version"));
    System.setProperty("javax.net.debug", "ssl");
    System.setProperty("sun.net.ssl.checkRevocation", "false");
    java.lang.System.setProperty("sun.security.ssl.allowUnsafeRenegotiation", "true");
    Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
    SSLContext sc = SSLContext.getInstance("SSL");//TLSv1.2
    sc.init(null, new TrustManager[] {new TrustAllX509TrustManager() }, null);//new java.security.SecureRandom()
    
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
    
    @Override
    public boolean verify(String string, SSLSession ssls) {
    System.out.println("test HttpsURLConnection");
    return true;
    }
    });
    
    String userCredentialsnew = "abcdefghij01234567890klmnopqrstuvwxyz987";//"bearer abcdefghij01234567890klmnopqrstuvwxyz987";
    String basicAuth = "Basic "+ new String(new Base64().encode(userCredentialsnew.getBytes()));; //+ new String(new Base64().encode(userCredentials.getBytes()));
    URL hh= new URL("https://api.softtouch.eu/#/xxxxxxxx/#/customers?take=100");
    HttpsURLConnection conn = (HttpsURLConnection)hh.openConnection();
    
    
    conn.setSSLSocketFactory(sc.getSocketFactory());
    conn.setHostnameVerifier( new HostnameVerifier() {
    
    @Override
    public boolean verify(String string, SSLSession ssls) {
    System.out.println("test conn");
    return true;
    }
    });
    
    conn.setDoInput(true);
    conn.setDoOutput(false);
    conn.setUseCaches(false);
    conn.setRequestMethod("GET");
    conn.setRequestProperty ("Authorization", basicAuth);
    conn.connect();
    
    
    BufferedReader inn = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    String inputLine;
    while ((inputLine = inn.readLine()) != null) {
    System.out.println(inputLine);
    }
    
    } catch (Exception e) {
    e.printStackTrace();
    }
    
    }
    }
    
    
    
    package com.softtouch.com;
    
    import javax.net.ssl.X509TrustManager;
    
    import java.security.cert.X509Certificate;
    
    
    
    public class TrustAllX509TrustManager implements X509TrustManager {
    public X509Certificate[] getAcceptedIssuers() {
    System.out.println("test1");
    //return new X509Certificate[0];
    return null;
    }
    
    public void checkClientTrusted(java.security.cert.X509Certificate[] certs,String authType) {
    System.out.println("test2");
    }
    
    public void checkServerTrusted(java.security.cert.X509Certificate[] certs,String authType) {
    System.out.println("test3");
    }
    
    }
    

Но пока я не смог решить проблему. Я получил «исключение javax.net.ssl.SSLHandshakeException».
Я хочу подключиться к серверу с помощью Java. Что будет причиной этой проблемы?

Примечание: — Я проверялhttps://api.softtouch.eu/#/accounts/#/xxxxxxxx?take=100«соединение с PHP. Это работает хорошо. Но исходный файл PHP использовал следующую строку для отключения проверки SSL.
curl_setopt ($ httpRequest, CURLOPT_SSL_VERIFYPEER, FALSE);

Это текст отладки SSL:
*** ClientHello, TLSv1.2
RandomCookie: GMT: 1425473345 байт = {113, 222, 27, 25, 227, 136, 38, 249, 128, 230, 125, 228, 156, 5, 175, 99, 22, 55, 227, 185, 101, 32, 160, 186, 72, 167, 247, 166}
Идентификатор сессии: {}
Cipher Suites: [TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_DSS_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC _SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, TLS_EMPTY_RENEGOTIATION_INFO_SCSV] Методы сжатия: {0}
Расширение elliptic_curves, названия кривой: {secp256r1, sect163k1, sect163r2, secp192r1, secp224r1, sect233k1, sect233r1, sect283k1, sect283r1, secp384r1, sect409k1, sect409r1, secp521r1, sect571k1, sect571r1, secp160k1, secp160r1, secp160r2, sect163r1, secp192k1, sect193r1, sect193r2 , secp224k1, sect239k1, secp256k1}
Расширение ec_point_formats, форматы: [несжатый] Расширение сигнатура_алгоритмы, сигнатура_алгоритмы: SHA512 с ECDSA, SHA512 с RSA, SHA384 с ECDSA, SHA384 с RSA, SHA256 с ECDSA, SHA256 с RSA, SHA224 с ECDSA, SHA224 с RSA, SHA1 с SHA1, сAW1, сA1, с1


main, WRITE: TLSv1.2 Рукопожатие, длина = 195
основной, ЧИТАЙТЕ: предупреждение TLSv1.2, длина = 2
основной, RECV TLSv1.2 ALERT: смертельно, handshake_failure
main, называется closeSocket ()

-1

Решение

Сертификат для сайта в порядке, поэтому вам не нужно отключать проверку сертификата. Но сайт требует использования Индикация имени сервера (SNI) представить правильный сертификат. Если SNI поддерживается, зависит и если он включен, зависит от версии Java, но это не доступно с Java 1.6 и ниже.

Кроме того, исключение рукопожатия может указывать на то, что проблема вообще не связана с проверкой сертификата. Сайт поддерживает только несколько шифров, которые используют AES256. Но поддержка AES256 не доступна в Java по умолчанию из-за ограничений экспорта.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]