Berbagi teknologi

Penjelasan rinci tentang Okhttp hostnameVerifier

2024-07-08

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

Pengenalan metode

Posting blog ini dianalisis menggunakan Okhttp 4.6.0hostnameVerfierSesuai dengan namanya, fungsi utama metode ini adalah untuk mengidentifikasihostnname legalitas. Kita dapat mengkonfigurasi Okhttp sendiri selama inisialisasihostnameVerfier

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

TetapiAda banyak informasi online tentangverfiyMengembalikan nilai true secara langsung sangat berbahaya.Tentu saja jika vertify kembali gagal, berarti verifikasi hostname gagal dan permintaan http tidak dapat berhasil. Misalnya, jika saya memulai permintaan http dengan alamat blog saya, pesan kesalahannya adalah sebagai berikut:
Masukkan deskripsi gambar di sini

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

Tempat dimana vertify dijalankan adalah diKoneksi NyataDi dalam, setelah eksekusi.
Masukkan deskripsi gambar di sini

Selain kustomisasihostnameVerfierSelain itu, Okhttp menyediakan implementasi default. Sekarang mari kita menganalisis prinsip-prinsip internal.

Prinsip inti

OkHostnameVerifier dibangun ke dalam Okhttp, dan metode ini lolossession.peerCertificates[0] as X509CertificateDapatkan objek sertifikat

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