Я пишу Java-приложение, которое должно подключаться к удаленный сервер с использованием HTTPS. Код для подключения готов, однако SSL-сертификат сервера был подписан StartSSL, которого нет в корневом хранилище сертификатов CA Java.
Используя этот код, я получите действительную информацию о сертификате с таких веб-сайтов, как https://www.google.com/:
Код: Выделить всё
Response Code : 200
Cipher Suite : TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
Cert Type : X.509
Cert Hash Code : -1643391404
Cert Public Key Algorithm : RSA
Cert Public Key Format : X.509
Cert Type : X.509
Cert Hash Code : 771393018
Cert Public Key Algorithm : RSA
Cert Public Key Format : X.509
Cert Type : X.509
Cert Hash Code : 349192256
Cert Public Key Algorithm : RSA
Cert Public Key Format : X.509
Тот же код генерирует исключение SSLHandshakeException для моего домена (назовем его https://www.example.com/).
Тот же код генерирует исключение SSLHandshakeException для моего домена (назовем его https://www.example.com/).
p>
Конечно, я мог бы вручную добавить сертификат в хранилище ключей с помощью keytool (возможно, даже с помощью Runtime.exec("keytool ...")) , но это слишком грязно. Сейчас я планирую добавить корневой сертификат StartSSL в файлы моего приложения для распространения, а затем загрузить его во временное хранилище ключей во время выполнения. Таким образом, «настоящее» хранилище ключей остается нетронутым.
Судя по тому, что я прочитал здесь и здесь, мне придется возиться с некоторыми классами, такими как TrustManager. Я даже нашел способ полностью отключить проверку, но это не то, чего я хочу, поскольку, похоже, это сводит на нет всю цель зашифрованной связи.
Я даже нашел несколько строки кода, которые, кажется, делают именно то, что я хочу, но я не могу понять, как вызвать этот метод, то есть какие значения передать в качестве аргументов:
Код: Выделить всё
public class SSLClasspathTrustStoreLoader {
public static void setTrustStore(String trustStore, String password) throws Exception {
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("X509");
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
InputStream keystoreStream = SSLClasspathTrustStoreLoader.class.getResourceAsStream(trustStore);
keystore.load(keystoreStream, password.toCharArray());
trustManagerFactory.init(keystore);
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustManagers, null);
SSLContext.setDefault(sc);
}
}
Подробнее здесь: https://stackoverflow.com/questions/328 ... me-in-java
Мобильная версия