Compartir tecnología

Explicación detallada de Okhttp hostnameVerifier

2024-07-08

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Introducción al método

Esta publicación de blog se analiza utilizando Okhttp 4.6.0hostnameVerfierComo sugiere el nombre, la función principal de este método es identificarhostnname de legalidad. Podemos configurar Okhttp nosotros mismos durante la inicialización.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();

peroHay mucha información en línea sobreverfiyDevolver verdadero directamente es muy peligroso.Por supuesto, si vertify devuelve fasle, significa que la verificación del nombre de host falla y la solicitud http no puede tener éxito. Por ejemplo, si inicio una solicitud http con la dirección de mi blog, el mensaje de error es el siguiente:
Insertar descripción de la imagen aquí

{http errorCode=-500, mErrorMsg=Hostname yanchen.blog.csdn.net not verified:
    certificate: sha256/tlnf6pbfeu257hnJ9e6j4A1ZWH3vVMzn3Zn3F9kLHdg=
    DN: CN=*.blog.csdn.net
    subjectAltNames: [*.blog.csdn.net]}

El lugar donde se ejecuta vertify es enConexión RealEn el interior, tras la ejecución.
Insertar descripción de la imagen aquí

Además de la personalizaciónhostnameVerfierAdemás, Okhttp proporciona una implementación predeterminada. Ahora analicemos los principios internos.

Principios básicos

OkHostnameVerifier está integrado en Okhttp y este método pasasession.peerCertificates[0] as X509CertificateObtener el objeto del certificado

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