我的
Android项目(OkHttp 3.3.1)目前适用于我的HTTPS Web服务(我的PC,IIS Web服务器,Asp.Net Web API,自签名证书)
助手方法:
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();
阅读this CertificatePinner guide后,我的项目在添加.certificatePinner(certificatePinner)时也能正常工作,如下所示:
代码B:
OkHttpClient client = new OkHttpClient.Builder()
.sslSocketFactory(getSSLSocketFactory())
.certificatePinner(certificatePinner)
.hostnameVerifier(getHostnameVerifier())
.build();
根据this Wiki,证书钉扎增加了安全性.
但是,实际上我还没有清楚地理解这个想法.所以我的问题是,当我的应用程序仍然使用代码A时,我是否需要或必须使用certificatePinner.换句话说,代码B是否具有比代码A更好的安全性?
最佳答案 证书固定应该有助于某些类型的攻击
>任何受信任的证书颁发机构都会被黑客入侵并为您的域生成有效的证书,例如MITM攻击由一个侵入性政府.
>您的应用程序正在具有其他可信证书的设备上运行,例如由提供电话的公司安装.
我认为一般来说,如果你从两个主要的CA颁发证书,例如verisign,你会签署他们的签名证书而不是你自己的签名证书.这是因为您可能会为您的服务器生成新证书作为例行事项.