Kotlin&Android Studio:允许应用信任所有SSL证书的方法
Android 信任所有SSL证书解决方案
问题原因
你遇到的javax.net.ssl.SSLHandshakeException错误,本质是Android系统默认仅信任由权威CA颁发的SSL证书,而目标私有HTTPS地址使用的是未被系统认可的自签名/私有证书,导致证书验证失败。
实现步骤
通过自定义X509TrustManager和SSLSocketFactory,跳过证书验证逻辑,让应用信任所有SSL证书。以下是具体代码实现:
- 创建信任所有证书的TrustManager
import javax.net.ssl.X509TrustManager; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; public class TrustAllCerts implements X509TrustManager { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {} @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {} @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } }
- 构建信任所有证书的SSLContext
import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import java.security.SecureRandom; public class SSLUtils { public static SSLSocketFactory getTrustAllSSLSocketFactory() { try { SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, new TrustManager[]{new TrustAllCerts()}, new SecureRandom()); return sslContext.getSocketFactory(); } catch (Exception e) { throw new RuntimeException(e); } } }
- 在网络请求库中配置使用该SSLSocketFactory
以OkHttp为例:
import okhttp3.OkHttpClient; OkHttpClient client = new OkHttpClient.Builder() .sslSocketFactory(SSLUtils.getTrustAllSSLSocketFactory(), new TrustAllCerts()) .hostnameVerifier((hostname, session) -> true) // 同时跳过主机名验证 .build();
重要提醒
- 该方法仅适用于测试环境或内部私有部署场景,生产环境绝对不能使用,会完全暴露应用的网络请求到中间人攻击风险,严重威胁数据安全。
- 若条件允许,建议获取目标服务器的私有证书,将其放入应用的
res/raw目录,通过自定义信任管理器仅信任该证书,而非全部证书,这样能兼顾功能和安全性。
内容的提问来源于stack exchange,提问作者felixschoene
相关产品推荐
相关产品推荐

