能否绕过 SSL Pinning(证书固定)?
1. SSL Pinning 是什么,它如何工作?
简单来说,SSL(Secure Socket Layer)Pinning 是开发者在客户端使用的一种技术,用于防范 中间人攻击(man-in-the-middle)。
使用这项技术时,开发者会在开发阶段把一组受信任的证书嵌入(即 pin)到客户端应用中,并在运行时用这些证书与服务器证书进行比对。
即使完成 SSL 握手之后,客户端仍会再次校验服务器证书。如果服务器证书与本地保存的证书不一致,连接就会被直接中断,用户数据也不会再发送到该服务器。
2. 有无 SSL Pinning 的区别?
这种强制校验可以确保用户设备只与受信任的服务器通信。
因此,它常被用来阻止那些生成自签名证书的中间人应用分析应用的功能,以及应用与服务器的通信方式。
下面我们用 Proxyman 抓取 Product Hunt 和 Dropbox 的流量,作为示例。
可以看到,Product Hunt 的客户端没有使用 SSL Pinning。因此,Proxyman 可以同时充当服务器和客户端进行通信,并抓取来自 Product Hunt 以及发往 Product Hunt 的全部数据。
Product Hunt 的流量已被 Proxyman 抓取
与此相反,启用 SSL Pinning 后,由于 Dropbox 客户端检测到 Proxyman 的 CA 不在预置证书列表中,所有发往服务器的请求都会被断开。
Proxyman 无法抓取 Dropbox 的流量
3. 能否绕过 SSL Pinning?
现在我们知道,通过 Pinning 限制受信任证书的范围可以阻止攻击者,但是否有办法绕过这一机制呢?答案是:既可以,也不可以 (:
-
如果我们不是该公司的开发者,很可能无法提供与应用客户端通信所需的有效证书。
-
但如果我们是该公司的开发者,持有原始证书及其对应的私钥,就可以把这些密钥添加到中间人应用中,从而绕过 SSL Pinning。
话虽如此,并非所有中间人应用都支持添加密钥来绕过这一机制 (:
4. 接下来做什么?
这篇小文只是简单介绍了为什么开发者有时无法抓取应用收发的流量。
更安全的测试方法
首先,在同一台设备上打开一个普通的 HTTPS 网站,例如 https://google.com。如果 Proxyman 能够读取该响应,而你的应用仍显示 SSL 错误,那么 Pinning 很可能就是原因。对于你自己开发的应用,请使用关闭了 Pinning 或信任测试证书的调试版本。Proxyman 无法解密仍启用 Pinning 的第三方应用,而且未经许可,你也不应尝试抓取任何应用的流量。
如果想进一步了解 SSL Pinning 的工作原理,以及如何在应用中实现这一机制,可以在这里学习 RWL 课程。
你也可以使用充当中间人角色的 Proxyman,来测试自己应用中的 SSL Pinning (:
Proxyman 是一款高性能的 macOS 应用,可帮助开发者查看来自 iOS 设备、iOS 模拟器和 Android 设备上的应用及域名的 HTTP/HTTPS 请求。
前往 https://proxyman.com 下载。

