前言

曾在Android系统抓包Bilibili客户端时遇到HTTPS验证问题,一直很不解,我不是安装了CA证书了吗?直到在52pojie看到@小木曾雪菜 的文章 [原创] 网络逆向(一) 油猴脚本与抓包初步 以显示b站楼层编号为例
才恍然大悟,b站客户端通过SSL pinning进行安全通信,原理大概是: 中间人通过伪造假的服务端证书来欺骗客户端,那么客户端就预置一份服务端证书来验证证书的真假.
之后机缘巧合下刚好在论坛的精华贴看到@psych1 的文章 [Android 原创] android系统https抓包问题分析
很好的解释了我遇到的问题,特此记录,侵删

HTTPS

http是超文本传输协议,其存在通信使用明文,内容极易被窃听;不验证通信方的身份,因此有可能遭遇伪装;无法证明报文的完整性,所以有可能遭到篡改的问题
于是HTTPS应运而生。https中的s是ssl或者tls,就是在原HTTP的基础上加上一层用于数据加密、解密、身份认证的安全层。

1
HTTP + 加密 + 认证 + 完整性保护 = HTTPS

HTTPS的单双向验证

SSL pinning

SSL-pinning有两种方式:
证书锁定(Certificate Pinning) 和公钥锁定( Public Key Pinning)。

证书锁定

需要在客户端代码内置仅接受指定域名的证书,而不接受操作系统或浏览器内置的CA根证书对应的任何证书,通过这种授权方式,保障了APP与服务端通信的唯一性和安全性,因此客户端与服务端(例如API网关)之间的通信是可以保证绝对安全。但是CA签发证书都存在有效期问题,缺点是在
证书续期后需要将证书重新内置到APP中。

公钥锁定

提取证书中的公钥并内置到客户端中,通过与服务器对比公钥值来验证连接的正确性。制作证书密钥时,公钥在证书的续期前后都可以保持不变(即密钥对不变),所以可以避免证书有效期问题,一般推荐这种做法。

与双向验证不同,SSL pinning方案是服务端发送CA证书给客户端,客户端将本地预置的证书(存放在.\asset目录或\res\raw下)与其进行校验,而双向验证
额外有个客户端向服务器发送CA证书,服务器对客户端证书进行校验的过程

解决方案

不是研究方向,未实际做过,直接贴原文:
https://www.52pojie.cn/thread-1213657-1-1.html