安卓抓包软件(如Charles、Fiddler)在抓取经过SSL加密的网络数据时,需要捕获客户端发送的SSL证书进行解密,但一些APP使用了基于证书锁定的安全策略,使证书不可信,导致抓包软件无法解密SSL数据流。
问题分析
SSL通信的基本流程是:客户端发送连接请求,服务器返回证书以及公钥,客户端使用公钥加密生成对称密钥,发送到服务器,之后客户端和服务器开始使用对称密钥加密解密数据。
安卓系统对证书的检查有严格的限制,若证书不被信任,则无法建立与服务器的SSL连接,抓包软件也就无法解密数据流。因此,需要解决证书不被信任的问题。
证书认证
HTTP协议最初是不安全的,为了保证数据安全,HTTPS协议被引入并实现了基于SSL/TLS的安全传输协议。SSL/TLS(以下统称TLS)协议需要使用证书机制,其中客户端需要验证服务器提供的证书,来保证连接的安全性。
安卓系统使用的CA证书存储在系统的CA证书存储库中,这些证书被用来验证来自端点的证书,如果证书不被信任,则连接会被终止,具体的可以参考以下示例:
HttpsURLConnection conn = null;
try {
URL url = new URL("https://example.com/");
conn = (HttpsURLConnection) url.openConnection();
conn.setSSLSocketFactory(getSSLSocketFactory());
conn.setHostnameVerifier(getHostnameVerifier());
conn.setConnectTimeout(5000 /* 5 seconds /);
conn.setReadTimeout(5000 / 5 seconds */);
conn.connect();
// Handle connection success
} catch (IOException e) {
// Handle connection errors
} finally {
if (conn != null) {
conn.disconnect();
}
}
在以上例子中,getSSLSocketFactory()和getHostnameVerifier()用于获取自定义的证书验证器,通过这个验证器,可以使得使用自己CA证书的服务连接成功。
证书针对应用锁定
一些APP使用证书锁定策略,即在建立SSL连接时使用了与APP签名
上一篇:安卓抓包绕过ssl证书检测
下一篇:安卓装ubuntu原理