開発環境など諸々の理由から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で実装分ける等して
意図せずうっかり本番アプリに設定が入らないように注意すること