https原理
HTTPS是通过一次非对称加密算法(如RSA算法)进行了协商密钥的生成与交换,然后在后续通信过程中就使用协商密钥进行对称加密通信。
图一 https请求全过程
证书以及fiddler根证书
什么是CA
CA是Certificate Authority的缩写,也叫“证书授权中心”。它是负责管理和签发证书的第三方机构,CA必须是所有行业和所有公众都信任的、认可的,具有足够的权威性。
什么是CA证书
CA 证书,顾名思义,就是CA颁发的证书。
什么是证书之间的信任关系?
就是用一个证书来证明另一个证书是真实可信滴。
什么是证书信任链?
实际上,证书之间的信任关系,是可以嵌套的。比如,C 信任 A1,A1 信任 A2,A2 信任 A3…这个叫做证书的信任链。只要你信任链上的头一个证书,那后续的证书,都是可以信任滴。
什么是根证书?
“根证书”即“root certificate”,假设 C 证书信任 A 和 B;然后 A 信任 A1 和 A2;B 信任 B1 和 B2。则它们之间,构成如下的一个树形关系(一个倒立的树)。
处于最顶上的树根位置的那个证书,就是“根证书”。除了根证书,其它证书都要依靠上一级的证书,来证明自己。那谁来证明“根证书”可靠捏?实际上,根证书自己证明自己是可靠滴(或者换句话说,根证书是不需要被证明滴)。
聪明的同学此刻应该意识到了:根证书是整个证书体系安全的根本。所以,如果某个证书体系中,根证书出了问题(不再可信了),那么所有被根证书所信任的其它证书,也就不再可信了。这个后果是相当相当滴严重(简直可以说是灾难性的)。
证书有啥用?
验证网站是否可信(针对HTTPS) 验证某文件是否可信(是否被篡改)
图二 fiddler导出的根证书
fiddler解密https
1
https 证书校验
再看图一,步骤3,如何进行校验?
数字签名的加密过程**:**** **证书内容的hash值,再用私钥加数。
字签名解密**:**** **使用公钥解密,获得hash值。
证书校验**:**** **客户端解密数字签名获得证书hash值,以及将证书内容重新hash计算一次,对比结果是否一致。(个人理解这里有个假设是,客户端获取到的公钥一定是正确的,不可能被篡改的)。
2
fiddler解密https原理
第一步,Fiddler截获客户端发送给服务器的HTTPS请求,Fiddler伪装成客户端向服务器发送请求进行握手 。
第二步,服务器发回响应,Fiddler获取到服务器的CA证书, 用根证书公钥进行解密, 验证服务器数据签名, 获取到服务器CA证书公钥。然后Fiddler伪造自己的CA证书, 冒充服务器证书传递给客户端浏览器。
第三步,与普通过程中客户端的操作相同,客户端根据返回的数据进行证书校验、生成密码Pre_master、用Fiddler伪造的证书公钥加密,并生成HTTPS通信用的对称密钥enc_key。
第四步,客户端将重要信息传递给服务器, 又被Fiddler截获。Fiddler将截获的密文用自己伪造证书的私钥解开, 获得并计算得到HTTPS通信用的对称密钥enc_key。Fiddler将对称密钥用服务器证书公钥加密传递给服务器。
第五步,与普通过程中服务器端的操作相同,服务器用私钥解开后建立信任,然后再发送加密的握手消息给客户端。
第六步,Fiddler截获服务器发送的密文, 用对称密钥解开, 再用自己伪造证书的私钥加密传给客户端。
第七步,客户端拿到加密信息后,用公钥解开,验证HASH。握手过程正式完成,客户端与服务器端就这样建立了“信任”。
**非对称加密和数字签名的区别:**非对称加密 用的是接收方的公钥进行数据加密的,密文到达对方后也是通过接收方自己的私钥进行解密,还原成明文,整个数据加密和解密过程用的都是接收方的密钥;而数字签名则完全相反,是通过发送方的私钥进行数据签名的,经签名的数据到达接收方后也是通过事先告知接收方的发送方的公钥进行解密,整个数据签名和解密的过程用的都是发送方的密钥。
Fiddler抓取HTTPS协议成功的关键
是根证书,这是一个信任链的起点,这也是Fiddler伪造的CA证书能够获得客户端和服务器端信任的关键。也就是移动端要信任fiddler下发的根证书。
Fiddler抓取HTTPS,安卓端的设置
1、抓取安卓浏览器的https包:
浏览器中输入PC端ip加fiddler代理端口如:10.18.101.10*:8888,然后网页中点击下载FiddlerRoot.cer证书,并安装(一般手机设置–>安全→安装证书或凭证)。然后fiddler设置如下即可:
2、抓取安卓应用的https数据包
需要在安卓应用中将FiddlerRoot.cer证书加信任,才可解密。
3、如何获取证书中的公钥
①.APP中信任证书一般将获取证书公钥的base64(sha256(publicKey)),所以首先导出根证书:
②.转换文件格式
③.使用工具OpenSSL从cer文件中获取公钥的base64(sha256(publicKey))
OpenSSL包含一个命令行工具用来完成OpenSSL库中的所有功能,cmd中输入命令:
openssl x509 -in cert.cer -pubkey -noout -inform der | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64