女朋友最近在学习 wireshark 时候问了我一个问题:为什么使用 http.host == baidu.com
过滤不到请求数据?
明明已经在 Chrome 上输入了 baidu.com,也看到返回结果了,为什么通过 http.host == baidu.com
过滤不到数据包呢?
答案也很明显,因为浏览器输入 baidu.com 的时候使用了 HTTPS(加密的 HTTP),而 HTTP 是应用层协议,所以使用 http
过滤的前提是 wireshark 能看到应用层数据。
什么是 HTTP?
HTTP 是一种明文的超文本传输协议。
HTTP 为什么不安全?
客户端的请求经过多次路由后才能到达服务器,中间会经过路由器,代理服务器等诸多第三方服务器,如果中间服务器出现叛变或者恶意劫持客户端传递的信息,那么客户端的信息谈何安全可言?
我们来看一个案例:张三给罗翔发送一个 T 的小视频,张三够不够成传播淫秽物品罪?好吧,这不在我们本文讨论的范围,我们关心的是张三给罗翔发的小视频会不会被小朋友截取?
加密一下:密钥如何传输?
张三:为了不让小孩子看到这些小视频,咱们用一个密码把小视频加密一下嘛,这样小视频在传输的过程中即便被小朋友劫持也是看不到的,你说对不对?
罗翔:对是对,但是你得告诉我什么密码吧?要不然我收到了也看不了(???)。
张三:我单独发给你行吗?
罗翔:你傻呀,你发给我的请求被小朋友截取了,那一切努力不就白费了吗?
旁白君:以上张三和罗老师讨论的加密方式在计算机领域被称作为对称加密。
换个加密方式: RSA 如何?
张三:有一种叫做 RSA 的加密算法很神奇的,你听过吗?
旁白君:RSA 具有如下特点
- 公钥加密由私钥解
- 私钥解码由公钥解
- 公钥大家都可以知道,但是私钥只有自己知道
罗翔:嗯,知道,你说说你的想法。
张三:你把你的公钥给我,我用它来加密小视频,你收到后用你的私钥解密,你看行不行?
罗翔:行,那咱们试试看?
(3 years later……)
罗翔:太慢了吧,等我小视频全部收到老夫尚能饭否?
加密/解密太慢了?
张三:咱们约定一下用 XO
作为对称加密的密钥,我用你的公钥把 XO
加密后给你,你收着,以后咱们就用它加密了,好不好?
罗翔:同九年,汝甚秀。
旁白君:用非对称加密算法 RSA 交换对称加密用到的密钥,这就是 HTTPS 加密传输的核心原理。
(3 minutes later ……)
罗翔:一切就绪,小视频发过来吧……
张三:等等,我总感觉你是冒充的,我不能无理由相信这就是你的公钥吧。请你先证明你是你自己,你就是罗翔?
罗翔:what ???
证明你是你自己?
罗翔:这样,咱们找个有公信力的公证机构,就比如火星派进所
。我把经过它认证的证书给你,里面有我的公钥。
张三:这确实是个好办法,但是你如何保证你把 火星派进所
认证后的证书在给我的时候没有被小朋友篡改呢?
你确定公证处的证书没被修改?
罗翔:让公证处给按个手印(数字签名),你知道手印造假成本很高嘛,你收到之后再辨识一下。
张三:完美,成交。
旁白君:证书 + 数字签名 ==> 数字证书,简单解释数字签名是把包含公钥的消息经过不可逆 Hash 后得到的,把这个签名和公钥等信息放入证书中,收到证书后将消息使用同样的 Hash 算法得到一个新签名,如果和证书中的签名一致,说明消息没有被篡改。
以上就是 HTTPS 的加密算法原理,具体实现的时候会在传输层应用层之间专门有一层来实现以上加密算法,称作 TLS (Transport Layer Security)。顺便科普一下,早期的实现协议是 SSL,后来演变变成了 TLS,目前 TLS 版本有 v1.1, v1.2, v1.3,其中 v1.1 就是早期的 SSLv1.3。
Wireshark 抓包看一下
建立 TLS 连接之前,客户端和服务端要进行握手(这里指的不是 TCP 三次握手),握手阶段要完成如下三件事情:
- Client Hello: 发起 TLS 请求,告知服务端支持的加密算法
- Server Hello: 下发数字证书,协商加密算法
- 客户端和服务端交换接下来对称加密用到的 4 个密钥(客户端和服务端加密的密钥不同,各自分别由两个密钥,其中一个叫 MAC 密钥,用于验证数据完整性)
(图片来自:https://hpbn.co/transport-layer-security-tls/)
解密 TLS
Fiddler 解密
了解 HTTPS(TLS) 加密原理后,我们知道要解密 TLS 根本方法是获取到私钥,当然如果我们无法获取到私钥的情况下还有一种常用的方式是使用本地代理,如下如:
Fiddler 解密 TLS 原理就是如上,所以启用 Fiddler 解密我们需要:
- 信任 Fiddler 的跟证书(没有认证过的证书)
- 启用代理,默认情况下 Fiddler 代理服务监听 8888 端口,所以我们只需要把流量代理到 localhost:8888 端口即可解密 TLS 记录
Wireshark 解密 HTTPS
因为 Wireshark 是直接分析网卡出口的数据,所以无法通过代理解密 TLS。
Wireshark是一个网络封包分析软件,处于混杂模式(Promiscuous)的Wireshark可以抓取改冲突域的所有网络封包。它的基本原理是通过程序将网卡的工作模式设置为“混杂模式”,这时网卡将接受所有流经它的数据帧,这实际上就是Sniffer工作的基本原理:让网卡接收一切他所能接收的数据。Sniffer就是一种能将本地网卡状态设成混杂状态的软件,当网卡处于这种”混杂”方式时,该网卡具备”广播地址”,它对所有遇到的每一个数据帧都 产生一个硬件中断以便提醒操作系统处理流经该物理媒体上的每一个报文包。
Wireshark 解密 TLS 的几种方式总结如下:
- 导入私钥(前提:有私钥),可配合 Fiddler 代理
- 设置 SSLKEYLOGFILE 环境变量,Chrome 等浏览器会检测该环境变量,然后把解密私钥缓存起来
以上,谨以此文送给我的女朋友。