CertPathValidatorException connecting to a Let's Encrypt host on Android M or earlier

后端 未结 5 1042
礼貌的吻别
礼貌的吻别 2020-12-31 04:42

[edit: If you are here for Let\'s Encrypt expiry event from January 2021, read this first https://letsencrypt.org/2020/12/21/extending-android-compatibility.html]

5条回答
  •  执笔经年
    2020-12-31 05:41

    For Glide just register an OkHttp ModelLoaderFactory for GlideUrl model class.

    @GlideModule
    class GlobalGlideModule : AppGlideModule() {
        override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
            if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.N_MR1) {
                try {
    
                    val isrgRootX1 = ... // X509Certificate
    
                    val handshakeCertificates = HandshakeCertificates.Builder()
                        .addTrustedCertificate(isrgRootX1)
                        .addPlatformTrustedCertificates()
                        .build()
    
                    val okHttpClient = OkHttpClient.Builder()
                        .sslSocketFactory(handshakeCertificates.sslSocketFactory(), handshakeCertificates.trustManager())
                        .build()
    
                    // use our custom okHttp instead of default HTTPUrlConnection
                    registry.replace(
                        GlideUrl::class.java,
                        InputStream::class.java,
                        OkHttpUrlLoader.Factory(okHttpClient)
                    )
                } catch (t: Throwable) {
                    super.registerComponents(context, glide, registry)
                }
            } else {
                super.registerComponents(context, glide, registry)
            }
        }
    }
    

    See example in this PR.

提交回复
热议问题