2024-07-08
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Этот пост в блоге анализируется с использованием Okhttp 4.6.0.hostnameVerfier
Как следует из названия, основной функцией этого метода является выявлениеhostnname
законности. Мы можем сами настроить Okhttp во время инициализации.hostnameVerfier
:
new OkHttpClient.Builder()
.connectTimeout(20, TimeUnit.SECONDS)
.readTimeout(20, TimeUnit.SECONDS)
.writeTimeout(35, TimeUnit.SECONDS)
.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
//注意这里在生产环境中千万不要直接写死true
return true;
}
})
.build();
ноВ Интернете есть много информации оverfiy
Возвращать true напрямую очень опасно.Конечно, если vertify возвращает fasle, это означает, что проверка имени хоста не удалась и HTTP-запрос не может быть выполнен. Например, если я инициирую HTTP-запрос с адресом моего блога, сообщение об ошибке будет выглядеть следующим образом:
{http errorCode=-500, mErrorMsg=Hostname yanchen.blog.csdn.net not verified:
certificate: sha256/tlnf6pbfeu257hnJ9e6j4A1ZWH3vVMzn3Zn3F9kLHdg=
DN: CN=*.blog.csdn.net
subjectAltNames: [*.blog.csdn.net]}
Место, где выполняется vertify, находится по адресуRealConnectionВнутри, после казни.
В дополнение к настройкеhostnameVerfier
Кроме того, Okhttp предоставляет реализацию по умолчанию. Теперь давайте проанализируем внутренние принципы.
OkHostnameVerifier встроен в Okhttp, и этот метод передаетsession.peerCertificates[0] as X509Certificate
Получить объект сертификата
override fun verify(host: String, session: SSLSession): Boolean {
return try {
verify(host, session.peerCertificates[0] as X509Certificate)
} catch (_: SSLException) {
false
}
}
fun verify(host: String, certificate: X509Certificate): Boolean {
return when {
host.canParseAsIpAddress() -