すべての証明書のデフォルトの信頼を容易にするために試験したとき私たちは、それらが校正証明書を必要としているときに、サーバーへのアクセスにHTTPSを使用しますが、行は、証明書、および比較的簡単な方法クライアントがビルトインされている証明書、セットを設定する必要があるだろうというときこのようOKHttpなどのネットワークへのフレーム、クライアントはサーバ証明書は、一貫して、ネットワークアクセス時のローカル証明書ではありません検証しますように。具体的なコードは次のよう:
/**
*
* @param inputStream 本地证书的输入流
* @return 创建SSLSocketFactory对象
*/
public static SSLSocketFactory getSocketFactory(InputStream inputStream){
try {
//1:创建CertificateFactory对象
CertificateFactory cf = CertificateFactory.getInstance("X.509");
//2:接收证书输入流,生成证书对象
Certificate ca = cf.generateCertificate(inputStream);
//3:将证书对象放到keyStore中
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null, null);
trustStore.setCertificateEntry("ca", ca);
//4:利用keyStore初始化TrustManagerFactory
TrustManagerFactory trustManagerFactory =
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(trustStore);
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
//5:通过TrustManagerFactory初始化SSLContext
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustManagers, new SecureRandom());
//6:设置给OKhttp,这样OKhttp就会自动校验证书,至于访问的服务器传输过来的证书和本地证书一直才能握手成功,
// 可以通过单例模式在application中初始化
// mOkHttpClient.setSslSocketFactory(sslContext.getSocketFactory());
return sslContext.getSocketFactory();
}catch (Exception e){
e.printStackTrace();
}finally {
if(inputStream != null){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
上記の方法は、オブジェクトのSSLSocketFactoryを作成し、その後にOKhttpに設定します。
mOkHttpClient.setSslSocketFactory(socketFactory);
このロジックは、一般的にアプリケーション内に配置される校正証明書を初期化するために設けられています。
時々、証明書の有効期限が切れるので、我々は信頼するAPKにルート証明書によって発行された私たちの配偶者の証明書を置くことができるので、将来的には証明書を交換またはアップグレードした場合、発行または使用される長いルート証明書をクライアントにアップグレードする必要はありませんので。