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