Обмен технологиями

Подробное объяснение Okhttp hostnameVerifier

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() -