Как управлять областью действия SSLContext

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

trm = какой-то трастовый менеджер

SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, new TrustManager[] { trm }, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

Затем это устанавливает SSLContext для всех https-соединений, которые будут выполняться в будущем, независимо от того, какой поток. Каков самый чистый способ управления областью действия, чтобы я устанавливал ее только для тех вызовов, которые мне нужны?


person che javara    schedule 17.05.2011    source источник


Ответы (1)


Вы можете установить фабрику сокетов для фактического объекта подключения, который вы хотите использовать в этом доверенном хранилище:

HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
urlConnection.setSSLSocketFactory(sc.getSocketFactory());

Сделайте это вместо вызова setDefaultSSLSocketFactory.

person laz    schedule 17.05.2011
comment
спасибо, это звучит так, как будто это должно работать, но знаете ли вы какой-либо другой способ, который не требовал бы от вас получения экземпляра HttpsURLConnection? - person che javara; 17.05.2011
comment
Вы не используете HTTP? Какой тип соединения использует сокеты SSL? - person laz; 17.05.2011
comment
@che javara Вы получаете HttpsURLConnection каждый раз, когда используете URL-адрес HTTPS в Java. Это не дополнительный шаг. Ваш вопрос не имеет смысла. - person user207421; 18.05.2011
comment
Допустим, я использую структуру обмена сообщениями более высокого уровня, которая использует http под прикрытием, поэтому у меня нет прямого доступа для изменения экземпляра HttpsURLConnection. - person che javara; 18.05.2011
comment
Тогда вам нужно будет полагаться на механизм этого фреймворка для предоставления альтернативной фабрики сокетов. Если эти детали не раскрываются фреймворком, вам придется полагаться на глобальные настройки. В этом случае вы можете предоставить подкласс TrustManager, который выполняет отличающееся поведение только на выбранных хостах и ​​возвращается к исходному TrustManager для всех остальных. - person laz; 18.05.2011
comment
отличный ответ, Иаз, я склонялся к этому, но почему-то думал, что есть более «чистый» глобальный способ. - person che javara; 18.05.2011