技術共有

Okhttp hostnameVerifier の詳細な説明

2024-07-08

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

手法の紹介

このブログ投稿は Okhttp 4.6.0 を使用して分析されていますhostnameVerfier名前が示すように、このメソッドの主な機能は、hostnname合法性の。 初期化中に Okhttp を自分で設定できます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();

しかしについての情報がネット上にたくさんありますverfiytrue を直接返すことは非常に危険です。もちろん、verify が fasle を返した場合は、ホスト名の検証が失敗し、http リクエストが成功しないことを意味します。たとえば、ブログ アドレスを使用して http リクエストを開始すると、次のようなエラー メッセージが表示されます。
ここに画像の説明を挿入します

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

Verify が実行される場所は次のとおりです。リアルコネクション処刑後の内部。
ここに画像の説明を挿入します

カスタマイズに加えてhostnameVerfierさらに、Okhttp にはデフォルトの実装が用意されています。内部原理を分析してみましょう。

基本原則

OkHostnameVerifier は Okhttp に組み込まれており、このメソッドはsession.peerCertificates[0] as X509Certificate証明書オブジェクトを取得する

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