Я пытался извлечь данные из «https://api.softtouch.eu/#/xxxxxxxx/#/customers?take=100«используя Java.
Также я попытался решить проблему с https, используя следующие параметры: —
Добавлен сертификат (файл расширения .pem) в хранилище ключей ($ JAVA_HOME / jre / lib / security / cacerts) с использованием Java keytool
Добавлен центр сертификации в Ubuntu (/ usr / local / share / ca-сертификаты) с помощью команды update-ca-Certificates.
Наконец попытался отключить проверку сертификата и подключиться к серверу. (Класс 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 ()
Сертификат для сайта в порядке, поэтому вам не нужно отключать проверку сертификата. Но сайт требует использования Индикация имени сервера (SNI) представить правильный сертификат. Если SNI поддерживается, зависит и если он включен, зависит от версии Java, но это не доступно с Java 1.6 и ниже.
Кроме того, исключение рукопожатия может указывать на то, что проблема вообще не связана с проверкой сертификата. Сайт поддерживает только несколько шифров, которые используют AES256. Но поддержка AES256 не доступна в Java по умолчанию из-за ограничений экспорта.
Других решений пока нет …