我的Android项目(OkHttp 3.3.1)目前与我的HTTPS Web服务(我的PC,IIS Web服务器,Asp.Net Web API,自签名证书)配合使用。
帮助方法:
阅读完这个 CertificatePinner 指南后,我也成功地将以下代码添加了
根据这篇 Wiki的介绍,证书锁定可以提高安全性。
然而,实际上我还没有完全理解这个概念。我的问题是,当我的应用程序仍在使用 Code A 时,是否需要或必须使用
private SSLSocketFactory getSSLSocketFactory()
throws CertificateException, KeyStoreException, IOException,
NoSuchAlgorithmException, KeyManagementException {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream caInput = getResources().openRawResource(R.raw.iis_cert);
Certificate ca = cf.generateCertificate(caInput);
caInput.close();
KeyStore keyStore = KeyStore.getInstance("BKS");
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), null);
return sslContext.getSocketFactory();
}
private HostnameVerifier getHostnameVerifier() {
return new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
HostnameVerifier hv = HttpsURLConnection.getDefaultHostnameVerifier();
return hv.verify("BNK-PC.LOCALHOST.COM", session);
}
};
}
代码 A:
OkHttpClient client = new OkHttpClient.Builder()
.sslSocketFactory(getSSLSocketFactory())
.hostnameVerifier(getHostnameVerifier())
.build();
阅读完这个 CertificatePinner 指南后,我也成功地将以下代码添加了
.certificatePinner(certificatePinner)
:
代码 B:
OkHttpClient client = new OkHttpClient.Builder()
.sslSocketFactory(getSSLSocketFactory())
.certificatePinner(certificatePinner)
.hostnameVerifier(getHostnameVerifier())
.build();
根据这篇 Wiki的介绍,证书锁定可以提高安全性。
然而,实际上我还没有完全理解这个概念。我的问题是,当我的应用程序仍在使用 Code A 时,是否需要或必须使用
certificatePinner 。换句话说, Code B 是否比 Code A 更安全?