Compartilhamento de tecnologia

Explicação detalhada do Okhttp hostnameVerifier

2024-07-08

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

Introdução ao método

Esta postagem do blog foi analisada usando Okhttp 4.6.0hostnameVerfierComo o nome sugere, a principal função deste método é identificarhostnname da legalidade. Podemos configurar o Okhttp nós mesmos durante a inicializaçãohostnameVerfier

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

masHá muita informação online sobreverfiyRetornar true diretamente é muito perigoso.Obviamente, se vertify retornar fasle, significa que a verificação do nome do host falhou e a solicitação http não será bem-sucedida. Por exemplo, se eu iniciar uma solicitação http com o endereço do meu blog, a mensagem de erro será a seguinte:
Insira a descrição da imagem aqui

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

O local onde a verificação é executada é emConexão RealLá dentro, após a execução.
Insira a descrição da imagem aqui

Além da personalizaçãohostnameVerfierAlém disso, Okhttp fornece uma implementação padrão. Agora vamos analisar os princípios internos.

Princípios fundamentais

OkHostnameVerifier está integrado ao Okhttp e este método passasession.peerCertificates[0] as X509CertificateObtenha o objeto de 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() -