Рукопожатие SSLSocket
" [...] может быть инициировано одним из трех способов: "
- вызов startHandshake, который явно начинает рукопожатие, либо
- любая попытка чтения или записи данных приложения на этом сокете вызывает неявное рукопожатие, либо
- вызов getSession пытается установить сеанс, если естьв настоящее время нет действительного сеанса, и неявное рукопожатие выполнено.
Кажется, что единственный способ, применяемый через HttpsURLConnection
, - это попытаться что-то прочитать / записать (поскольку вы не можетеудерживайте базовый экземпляр SSLSocket
непосредственно, чтобы запустить рукопожатие или получить сеанс).
Если вы просто позвоните connection.getInputStream();
, прежде чем пытаться получить сертификат, это должно инициировать рукопожатие, и вы получитесертификаты впоследствии.
Обратите внимание, что вы достигнете этой точки только в том случае, если сертификат, который вы хотите просмотреть, пользуется доверием SSLContext
/ SSLSocketFactory
.Для этого вы можете создать хранилище ключей (которое вы будете использовать в качестве хранилища доверенных сертификатов) , которое содержит этот сертификат, как описано в этого ответа .Вы можете использовать if из своего собственного SSLContext
или использовать его глобально через системные свойства javax.net.ssl.trustStore*
(которые должны быть установлены перед любым использованием SSL. Избегайте примеров TrustManagers
, которые ничего не проверяют (здесь есть несколько на SO): он просто полностью отключит проверку сертификата, делая соединение потенциально уязвимым для атак MITM.