You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 06:30:10