Glide v4 + KotlinでSSL無視するやつ

開発環境など諸々の理由からSSLエラーを無視したいことがたまによくある。
glide での画像取得時にSSLを無視する場合、そういう設定をした okhttp を噛ませてやる必要があるが
ネット上は誤った情報や古い情報(Java / Glide v3以下)ばかりでズバリなコードがなかったのでメモ。

gradle 追加

以下が必要なのでgradleに追加

implementation "com.github.bumptech.glide:glide:$glideVersion"
implementation "com.github.bumptech.glide:okhttp3-integration:$glideVersion"
kapt "com.github.bumptech.glide:compiler:$glideVersion"

Glide v4からはkaptを使う必要があるので、必要に応じてその辺りも適宜追加

AppGlideModule 追加

SSLエラーを除外するための AppGlideModule を作成し、 @GlideModule アノテーションを付加すると
ビルド時にkaptが勝手に何かやってくれてアノテーションに指定したクラス名で参照できるようになる。
(ちなみに glideName を省略すると GlideApp という名前になるらしい)

SSLまわり設定は細かいことは置いといて、以下のような OkHttpClient を追加すればOK

@GlideModule(glideName = "MyGlide")
class MyGlideModule : AppGlideModule() {

    override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
        val sslSocket = getSSlSocket()
        val okHttpClient = OkHttpClient.Builder()
                .hostnameVerifier { _, _ -> true }
                .sslSocketFactory(sslSocket.first, sslSocket.second)
                .build()

        registry.replace(
                GlideUrl::class.java,
                InputStream::class.java,
                OkHttpUrlLoader.Factory(okHttpClient)
        )
    }

    private fun getSSlSocket() : Pair<SSLSocketFactory, X509TrustManager> {
        val trustAllCerts = arrayOf<TrustManager>(object : X509TrustManager {
            @SuppressLint("TrustAllX509TrustManager")
            override fun checkClientTrusted(chain: Array<X509Certificate>, authType: String) {}

            @SuppressLint("TrustAllX509TrustManager")
            override fun checkServerTrusted(chain: Array<X509Certificate>, authType: String) {}

            override fun getAcceptedIssuers(): Array<X509Certificate> {
                return arrayOf()
            }
        })

        val sslContext = SSLContext.getInstance("SSL").apply {
            init(null, trustAllCerts, java.security.SecureRandom())
        }
        return Pair(sslContext.socketFactory, trustAllCerts[0] as X509TrustManager)
    }
}

AppGlideModule の利用

Rebuildすると作成した AppGlideModule クラスが参照できるようになるので、
Glide利用箇所を Glide.with -> MyGlide.with みたいに差し替えればOK

MyGlide.with(this)
    .load(url)
    .into(imageView)

当然SSL無視の実装をリリースするのはまずいので、variantsで実装分ける等して
意図せずうっかり本番アプリに設定が入らないように注意すること

スポンサーリンク
レクタングル(大)
レクタングル(大)