SSLSocketFactory в Java

Какую роль играет SSLSocketFactory класс в Java играть при использовании HttpsURLConnection? Документация по Java не очень помогает.

Есть ли способы связать хранилище ключей и хранилище доверенных сертификатов с объектом sslsocketfactory, чтобы он указывал на хранилище ключей и хранилище доверенных сертификатов?

Иначе как соединение узнает местоположение хранилища ключей и хранилища доверенных сертификатов (я не хочу использовать Java System Properties)?

1 ответ

Решение

Это делается через SSLContext. Вы инициируете один, а затем используете его фабрику сокетов для создания экземпляров HttpsConnection.

Вот грубый пример того, как я управляю этим в моем приложении:

SSLContext sc = SSLContext.getInstance("SSL");
sc.init(myKeyManagerFactory.getKeyManagers(), myTrustManagerArray, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

после этого ваши openConnection() вызовы для сайтов https будут использовать sslsocketfactory, который вы здесь инициализировали.

Вот код для TrustManager для использования в вашем ssl-контексте, который будет доверять всем сертификатам:

TrustManager[] myTrustManagerArray = new TrustManager[]{new TrustEveryoneManager()};

class TrustEveryoneManager implements X509TrustManager {
    public void checkClientTrusted(X509Certificate[] arg0, String arg1){}
    public void checkServerTrusted(X509Certificate[] arg0, String arg1){}
    public X509Certificate[] getAcceptedIssuers() {
        return null;
    }
}

Upd от Bruno: будьте осторожны, доверяя любому сертификату, каким бы удобным он ни был, делает соединение уязвимым для атак MITM

Другие вопросы по тегам