由于监管机构的要求,我必须为所有 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 中存储预主密钥?