如何从Nginx获取OpenSSL TLSv1.3预主密钥?
解决Nginx记录TLSv1.3预主密钥的问题
核心前提说明
首先明确:TLSv1.3强制使用前向保密的密钥交换算法(比如ECDHE),你手里的RSA私钥确实没用——它只用于服务器身份验证,无法直接推导会话密钥,必须依赖SSL密钥日志文件来获取预主密钥/会话密钥。
可行解决方案
1. 确保依赖版本达标
你需要使用OpenSSL 1.1.1及以上版本,因为只有这个版本开始支持TLSv1.3的SSL密钥日志功能。先检查你的OpenSSL版本:
openssl version
如果版本低于1.1.1,先升级OpenSSL(可以源码编译或者用系统包管理器安装对应版本)。
2. 正确设置SSLKEYLOGFILE环境变量
你之前在bashrc里设置没用,大概率是因为Nginx不是通过你的bash会话启动的(比如用systemd管理)。要让Nginx启动时加载这个环境变量,得修改它的服务配置:
- 找到Nginx的systemd服务文件,通常是
/usr/lib/systemd/system/nginx.service或者/etc/systemd/system/nginx.service - 编辑文件,在
[Service]区块添加一行:Environment="SSLKEYLOGFILE=/var/log/nginx/ssl_keylog.log" - 先创建日志文件并设置权限(确保Nginx进程能写入):
touch /var/log/nginx/ssl_keylog.log chown nginx:nginx /var/log/nginx/ssl_keylog.log - 重新加载systemd配置并重启Nginx:
systemctl daemon-reload systemctl restart nginx
3. 验证密钥日志是否生成
发起几个HTTPS请求后,查看日志文件:
cat /var/log/nginx/ssl_keylog.log
如果能看到类似CLIENT_RANDOM xxxx yyyy的行,说明配置生效了,这些就是解密TLSv1.3流量需要的密钥。
4. 编译Nginx的注意事项(如果需要自定义编译)
如果是源码编译Nginx,要确保编译时指定的OpenSSL版本是1.1.1+,编译参数示例:
./configure --prefix=/usr/local/nginx --with-openssl=/path/to/openssl-1.1.1w --with-http_ssl_module make && make install
不需要额外开启Nginx的密钥日志选项,因为这个功能是OpenSSL提供的,只要环境变量设置正确,Nginx就会自动输出日志。
解密流量的后续操作
拿到密钥日志后,你可以用Wireshark加载这个文件(路径:编辑→首选项→Protocols→TLS→(Pre)-Master-Secret log filename),然后打开抓包文件就能解密TLSv1.3的流量了。
内容的提问来源于stack exchange,提问作者Sash Lamba
相关产品推荐
相关产品推荐

