从 nginx 中提取 openssl pre-master secret

信息安全 tls openssl nginx
2021-08-22 10:50:35

由于监管机构的要求,我必须为所有 TLS 连接存储预主密钥。我们正在使用 nginx 来终止 TLS。

我已经阅读了从 OpenSSL 应用程序中提取预主密钥,特别是出色的演练从 apache2 中提取 openssl 预主密钥,我能够从 apache 记录密钥,但使用 nginx 仍然没有成功。也许我错过了一些明显的东西?

我正在使用 Debian 9 系统进行测试。首先我检查 nginx 使用的是哪个版本的 openssl:

# nginx -V 2>&1 |grep SSL
built with OpenSSL 1.1.0k  28 May 2019
# ldd /usr/sbin/nginx |grep ssl
    libssl.so.1.1 => /usr/lib/x86_64-linux-gnu/libssl.so.1.1 (0x00007f9bd9f95000)

所以我安装libssl-dev了提供1.1.0k-1~deb9u1版本的包。

我下载了 sslkeylog.c并编译了它:cc sslkeylog.c -shared -o libsslkeylog.so -fPIC -ldl

为方便起见,我将编译后的库放入/usr/local/lib/libsslkeylog.so路径中。然后我编辑了 nginx 的 systemd 配置:

#cat /etc/systemd/system/nginx.service.d/override.conf
[Service]
Environment=SSLKEYLOGFILE=/tmp/premaster.txt
Environment=LD_PRELOAD=/usr/local/lib/libsslkeylog.so

# systemctl daemon-reload
# systemctl restart nginx

我可以看到它的LD_PRELOAD工作原理 -lsof主 nginx 进程和工作 nginx 进程都显示/usr/local/lib/libsslkeylog.so已加载:

# lsof -n -p 10313 |grep ssl
nginx   10313 root  mem    REG              254,1   442984   3255 /usr/lib/x86_64-linux-gnu/libssl.so.1.1
nginx   10313 root  mem    REG              254,1    14224  20914 /usr/local/lib/libsslkeylog.so
# lsof -n -p 10314 |grep ssl
nginx   10314 www-data  mem       REG              254,1   442984   3255 /usr/lib/x86_64-linux-gnu/libssl.so.1.1
nginx   10314 www-data  mem       REG              254,1    14224  20914 /usr/local/lib/libsslkeylog.so

但是在我通过 curl 访问 nginx 之后

curl -k -I https://localhost

或通过我电脑上的浏览器,/tmp/premaster.txt未创建

我究竟做错了什么?或者有没有更好的方法在 nginx 中存储预主密钥?

1个回答

好吧,正如我在 nginx 邮件列表中指出的那样,nginx 删除了从其父进程继承的所有环境变量,除了 TZ 变量,所以一旦我在nginx.conf

env LD_PRELOAD=/usr/local/lib/libsslkeylog.so;
env SSLKEYLOGFILE=/tmp/premaster.txt;

键开始按预期记录。