Teknologian jakaminen

Yksityiskohtainen selitys sovelluksesta Okhttp hostnameVerifier

2024-07-08

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

Menetelmän esittely

Tämä blogikirjoitus on analysoitu käyttämällä Okhttp 4.6.0:aahostnameVerfierKuten nimestä voi päätellä, tämän menetelmän päätehtävä on tunnistaahostnname laillisuudesta. Voimme määrittää Okhttp:n itse alustuksen aikanahostnameVerfier

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

muttaNetistä löytyy paljon tietoa aiheestaverfiyTotuuden palauttaminen suoraan on erittäin vaarallista.Tietenkin, jos verify palauttaa faslen, se tarkoittaa, että isäntänimen vahvistus epäonnistuu ja http-pyyntö ei onnistu. Jos esimerkiksi aloitan http-pyynnön blogini osoitteella, virheilmoitus on seuraava:
Lisää kuvan kuvaus tähän

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

Paikka, jossa verifiointi suoritetaan, on osoitteessaRealConnectionSisällä, suorituksen jälkeen.
Lisää kuvan kuvaus tähän

Räätälöinnin lisäksihostnameVerfierLisäksi Okhttp tarjoaa oletustoteutuksen, analysoidaan nyt sisäiset periaatteet.

Perusperiaatteet

OkHostnameVerifier on sisäänrakennettu Okhttp:een, ja tämä menetelmä kulkee läpisession.peerCertificates[0] as X509CertificateHanki sertifikaattiobjekti

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