https全链路分析
HTTPS 抓包与证书链分析,是理解 TLS 最好的实践方式之一。
很多人学了半天:
1 | RSA |
但是不知道这些东西到底在网络里长什么样。
实际上用 Wireshark 抓一次包,你会发现前面学的所有知识都能对应上。
一、HTTPS 抓包能看到什么
很多人以为:
1 | HTTPS = 完全看不到 |
实际上不是。
HTTPS 只是:
1 | 应用数据加密 |
握手过程很多信息仍然是明文。
例如:
1 | TCP三次握手 |
都能看到。
举例
访问:
1 | https://www.baidu.com |
抓包。
会看到:
1 | TCP |
二、TLS握手长什么样
TCP连接
首先:
1 | Client |
完成三次握手。
然后开始 TLS。
Client Hello
浏览器发送:
1 | Client Hello |
里面包含:
1 | TLS版本 |
例如:
1 | TLS_AES_128_GCM_SHA256 |
Wireshark里面类似:
1 | Client Hello |
Server Hello
服务器回复:
1 | Server Hello |
表示:
1 | 我选择TLS1.3 |
还能看到:
1 | ECDHE公钥 |
三、证书在哪里
后面会出现:
1 | Certificate |
展开以后:
1 | Certificate |
例如:
1 | Subject: |
这就是服务器证书。
四、证书里面到底有什么
很多人以为:
1 | 证书 = 公钥 |
其实不是。
证书本质上是:
1 | 身份证 |
里面包含:
1 | 域名 |
例如:
1 | CN=www.google.com |
五、证书链是什么
这是面试高频问题。
浏览器收到:
1 | google证书 |
为什么相信它?
因为:
1 | CA签发 |
例如:
1 | Google证书 |
形成:
1 | Leaf |
这就是:
1 | Certificate Chain |
证书链。
六、为什么需要中间CA
如果根CA直接签发:
1 | 几亿张证书 |
风险巨大。
所以现实是:
1 | Root CA |
例如:
1 | Root |
即使中间CA泄露:
1 | 吊销即可 |
根CA仍然安全。
七、浏览器怎么验证证书链
收到:
1 | Leaf证书 |
例如:
1 | www.google.com |
发现:
1 | Issuer: |
于是验证:
1 | Leaf签名 |
是否由:
1 | Google Trust Services |
签发。
然后继续:
1 | Google Trust Services |
是谁签发的?
发现:
1 | GlobalSign Root |
继续验证。
最后:
1 | GlobalSign Root |
就在浏览器内置信任库里。
因此:
1 | 整条链可信 |
八、浏览器内置了什么
Windows:
1 | 证书管理器 |
Linux:
1 | ca-certificates |
Chrome:
1 | Root Store |
里面存放:
数百个根证书。
例如:
- DigiCert
- GlobalSign
- ISRG
- Let’s Encrypt
浏览器真正信任的是:
1 | 根证书公钥 |
而不是网站证书。
九、数字签名如何验证
假设证书内容:
1 | CN=www.test.com |
CA计算:
1 | Hash(证书内容) |
得到:
1 | 123456 |
然后:
1 | CA私钥签名 |
得到:
1 | Signature |
浏览器收到:
1 | Certificate |
利用:
1 | CA公钥 |
验证。
成功说明:
1 | 证书未被修改 |
并且:
1 | 确实由该CA签发 |
十、中间人攻击怎么发生
假设没有证书验证。
攻击者:
1 | Client |
攻击者返回:
1 | 假的公钥 |
客户端也接受。
于是:
1 | 客户端 |
建立两条连接。
攻击者可以:
1 | 查看 |
所有数据。
这就是:
1 | MITM |
中间人攻击。
十一、为什么 Fiddler/Charles 能抓 HTTPS
很多开发者第一次用:
- Fiddler
- Charles
- Burp Suite
会很惊讶:
1 | HTTPS不是加密的吗? |
为什么还能看见请求?
因为这些工具会:
1 | 自己生成一个根证书 |
例如:
1 | Charles Root CA |
然后安装到系统信任库。
浏览器认为:
1 | Charles Root CA |
可信。
访问:
1 | https://www.google.com |
时:
Charles动态生成:
1 | www.google.com |
证书。
浏览器验证:
1 | 签发者 = Charles Root CA |
发现可信。
于是:
1 | 浏览器 |
建立两条 TLS。
Charles 就能看到:
1 | Request |
全部内容。
十二、为什么手机抓包经常失败
因为很多 App 开启:
1 | Certificate Pinning |
证书绑定。
例如 App 内写死:
1 | Google证书公钥 |
或者:
1 | 证书Hash |
即使系统信任:
1 | Charles Root CA |
App也会检查:
1 | 公钥不匹配 |
然后:
1 | TLS握手失败 |
十三、开发人员最应该掌握的几个命令
查看证书:
1 | openssl s_client -connect www.google.com:443 |
查看证书链:
1 | openssl s_client -showcerts \ |
查看详细内容:
1 | openssl x509 -text -noout |