1. 原料

1.1. 证书及私钥

1.1.1. 证书

/etc/nginx/cert.pem:

1.1.2. 私钥(无密码保护)

/etc/nginx/prvtkey.pem:

1.1.3. CA 证书(自建)

cacert.pem:

1.1.4. 说明

1.2. OpenSSL

1.3. Nginx

1.3.1. 版本及编译配置参数
1.3.2. 配置文件

注意,在 nginx 配置文件中,通过 ssl_ciphers 指令限制启用的加密算法,这里强制使用 RSA 密钥交换方式。查看 Nginx 配置 HTTPS ,获取更多关于 SSL 的配置信息。

1.4. tcpdump

1.5. cURL

1.6. Python

1.6.1. 版本

Python 3.10.6

1.6.2. 模块

1.7. Wireshark

在本机安装 Wireshark,本文使用的版本如下:

主要用于查看 pcap 数据包。如果不想安装 Wireshark,也可以使用 Python scapy 包解析 pcap 数据包,或者使用其它方式。


2. 准备工作

2.1. 启动 Nginx

如果 Nginx 未启动,那么使用下面的命令启动它:

2.2. 启动 tcpdump

其中:

2.3. 使用 cURL 发送 HTTPS 请求

其中,cacert.pem 是自建 CA 的证书。

可以在输出中看到类似下面的内容:

说明与 nginx.conf 中配置的一样,即使用的密钥交换方式是 RSA,对称加密算法是 AES256-GCM,哈希算法是 SHA384。

2.4. 停止 tcpdump,将 test.pcap 和 RSA 私钥拷贝到本机

2.5. 查看 pcap 数据包

打开 Wireshark。点击 File -> Open,选择 test.pcap。依次获取下述解密 HTTPS 流量用到的数据。

2.5.1. 获取 Client Hello 握手消息
2.5.2. 获取 Client Random
2.5.3. 获取 Server Hello、Certificate、Server Hello Done 握手消息
2.5.4. 获取 Server Random
2.5.5. 获取 Client Key Exchange 握手消息
2.5.6. 获取 RSA 加密的预主密钥

3. 使用 RSA 私钥解密 HTTPS 流量

3.1. Python 版本

注意

  1. 设置代码中的 private_key、encrypted_pre_master、client_hello 等变量的值
  2. 本示例指针的加密算法是 AES-GCM-SHA384,并且针对的是 Full Handshake 流程

3.2. Wireshark

macOS 版本


参考文档