问题
Android中间人会话劫持
思路
在代码中对https证书进行验证。
解决
步骤1:获取合法https证书
通过浏览器下载https证书,保存到assets文件夹,如下图:
步骤2:实现https证书认证
try {
//获取X.509格式的内置证书
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null);
Collection<? extends Certificate> cers = certificateFactory.generateCertificates(context.getAssets().open("MY.cer"));
int index = 0;
for (Certificate certificate : cers) {
String certificateAlias = Integer.toString(index++);
keyStore.setCertificateEntry(certificateAlias, certificate);
}
//用这个KeyStore去引导生成的TrustManager来提供验证
final TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);
//用TrustManager生成SSLContext
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom());
//SSLContext返回SSLSocketFactory
return sslContext.getSocketFactory();
} catch (Exception e) {
throw new RuntimeException(e);
}
总结
这样就可以防止中间人https证书伪造之类的劫持了。