Partage de technologie

Explication détaillée de Okhttp hostnameVerifier

2024-07-08

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

Présentation de la méthode

Ce billet de blog est analysé à l'aide d'Okhttp 4.6.0hostnameVerfierComme son nom l’indique, la fonction principale de cette méthode est d’identifierhostnname de légalité. Nous pouvons configurer nous-mêmes Okhttp lors de l'initialisationhostnameVerfier

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

maisIl existe de nombreuses informations en ligne surverfiyRevenir directement vrai est très dangereux.Bien sûr, si vertify renvoie fasle, cela signifie que la vérification du nom d'hôte échoue et que la requête http ne peut pas aboutir. Par exemple, si je lance une requête http avec l'adresse de mon blog, le message d'erreur est le suivant :
Insérer la description de l'image ici

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

L'endroit où vertify est exécuté est àConnexion RéelleA l'intérieur, après exécution.
Insérer la description de l'image ici

En plus de la personnalisationhostnameVerfierDe plus, Okhttp fournit une implémentation par défaut. Analysons maintenant les principes internes.

Principes de base

OkHostnameVerifier est intégré à Okhttp et cette méthode passesession.peerCertificates[0] as X509CertificateRécupérer l'objet certificat

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