当安卓客户端与服务器建立https连接时,需要验证服务器是否具备平台已知的CA证书。由于服务器的CA证书可能无法被安卓系统识别,有可能出现下面的异常:
javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
谷歌官方也给出了这个问题的详细介绍,解决的方法是通过加载证书文件,创建一个KeyStore,用来初始化TrustManager,用来信任加载的CA证书。再通过SSLContext将这个证书集替换默认的sslSocketFactory。
今天提出一个简单的证书集工具类,可方便管理自己的证书集。
public class CustomTrustManager {
protected static X509TrustManager trustManager;
protected static SSLSocketFactory sslSocketFactory;
private CustomTrustManager() {
try {
//读取证书文件,可用字符串流或文件
trustManager = trustManagerForCertificates(trustedCertificatesInputStream());
SSLContext sslContext = SSLContext.getInstance("TLS");
//使用sslContext将自定义证书集初始化
sslContext.init(null, new TrustManager[]{trustMana