使用Jetpack Compose中Coil的AsyncImage时如何解决证书错误?
解决Coil AsyncImage在模拟器中SSL握手失败的问题
你遇到的SSLHandshakeException是因为模拟器无法验证目标网站的SSL证书信任链,以下是几个可行的解决方法:
1. 更换高版本Android模拟器镜像
部分旧版本Android(如Android 10及以下)的系统镜像缺少最新的根证书,无法适配现代HTTPS网站的证书验证。建议创建使用Android 11及以上版本系统的模拟器,大部分情况下能直接解决问题。
2. 临时绕过SSL验证(仅测试环境使用)
如果暂时无法更换模拟器,可以为Coil配置忽略SSL验证的OkHttpClient,注意此方法绝对不能用于生产环境,代码示例如下:
@Composable @Preview fun AsyncImageTest() { // 创建跳过SSL验证的OkHttpClient val unsafeOkHttpClient = OkHttpClient.Builder() .sslSocketFactory( SSLContext.getInstance("TLS").apply { init(null, arrayOf<TrustManager>(object : X509TrustManager { override fun checkClientTrusted(chain: Array<out X509Certificate>?, authType: String?) {} override fun checkServerTrusted(chain: Array<out X509Certificate>?, authType: String?) {} override fun getAcceptedIssuers() = arrayOf<X509Certificate>() }), SecureRandom()) }, object : X509TrustManager { override fun checkClientTrusted(chain: Array<out X509Certificate>?, authType: String?) {} override fun checkServerTrusted(chain: Array<out X509Certificate>?, authType: String?) {} override fun getAcceptedIssuers() = arrayOf<X509Certificate>() } ) .hostnameVerifier { _, _ -> true } .build() val imageLoader = ImageLoader.Builder(LocalContext.current) .okHttpClient(unsafeOkHttpClient) .logger(DebugLogger()) .build() AsyncImage( model = ImageRequest.Builder(LocalContext.current) .data("https://picsum.photos/1500/1500") .build(), imageLoader = imageLoader, contentDescription = null ) }
3. 手动导入根证书到模拟器
- 通过浏览器访问
https://picsum.photos,查看网站证书详情并导出根证书(保存为.crt格式) - 使用ADB命令将证书推送到模拟器系统目录:
adb push your-cert-file.crt /system/etc/security/cacerts/ adb shell chmod 644 /system/etc/security/cacerts/your-cert-file.crt - 重启模拟器后重新测试
内容的提问来源于stack exchange,提问作者Kalaitos Ornitier
相关产品推荐
相关产品推荐

