测评目的 | 检测客户端是否包含明文存储的数字证书文件 |
---|---|
危险等级 | 中 |
危害 | Apk中使用的数字证书可被用来校验服务器的合法身份,以及在与服务器进行通信的过程中对传输数据进行加密、解密运算,保证传输数据的保密性、完整性。明文存储的数字证书如果被篡改,客户端可能连接到假冒的服务端上,导致用户名、密码等信息被窃取;如果明文证书被盗取,可能造成传输数据被截获解密,用户信息泄露,或者伪造客户端向服务器发送请求,篡改服务器中的用户数据或造成服务器响应异常 |
测评结果 | 存在风险(发现1处) |
测评结果描述 | 该Apk 中存在明文存储的数字证书文件 |
测评详细信息 | … (省略具体位置) |
解决方案
1.将项目中的.crt文件找到,提取文件中的内容复制在字符串上。例如:
private static String NEWCRT =“文件内容...”
/**
* okhttp 配置
* @param okHttpClientBuilder
* @param cerStr
*/
public static void setCertificate(OkHttpClient.Builder okHttpClientBuilder, String cerStr) {
try {
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(cerStr.getBytes());
Certificate ca = certificateFactory.generateCertificate(byteArrayInputStream);
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
byteArrayInputStream.close();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(keyStore);
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), new SecureRandom());
okHttpClientBuilder.sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) tmf.getTrustManagers()[0]);
okHttpClientBuilder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
} catch (Exception e) {
e.printStackTrace();
}
}