从 apache2 中提取 openssl pre-master secret

信息安全 tls openssl 阿帕奇 解密
2021-09-10 19:12:30

我希望能够解密我服务器的 https 流量以进行调试和分析。我的服务器是运行 mod_wsgi 和 django 的 debian 9 Apache2 服务器。

我看过这篇文章: Extract pre-master keys from an OpenSSL application

我发现我可能可以使用https://httpd.apache.org/docs/2.4/mod/mod_ssl.html#sslopensslconfcmd

让 apache 输出那些 dh 密钥,但我不知道该怎么做。

我知道这是可能的,因为它是由许多安全应用程序和供应商(例如 IPS/IDS 系统)完成的。

有任何想法吗?

1个回答

Apache om Debian 9 (Stretch) 使用 OpenSSL 1.0.2(请参阅apache2-bin对libssl1.0的依赖),因此您可以使用该链接帖子中记录的方法。您可以修改启动脚本以导出LD_PRELOAD=/path/to/libsslkeylog.soSSLKEYLOGFILE=/tmp/your.keys.

如何做到这一点取决于应用程序。对于 systemd,您可以尝试systemctl edit apache2创建一个覆盖。如果还是像 Apache 这样经典的 sysvinit init 脚本,尝试/etc/init.d/apache2用上面两个环境变量修改。不要忘记export关键字。 Apache 似乎不再使用 sysvinit 脚本,因此您必须修改 systemd 单元文件。

这将导致主密钥写入 SSLKEYLOGFILE 环境变量指定的文件。它不完全是 premaster secret,但您可以使用它在 Wireshark 中启用解密。有关后者的更多详细信息,另请参阅https://wiki.wireshark.org/TLS

根据您的用例,跳过服务器的修改并在客户端点击键可能更容易。Firefox 和 Chromium 具有对 SSLKEYLOGFILE 环境变量的内置支持。较新版本的 curl 也支持这一点,但较旧版本的 curl 或其他使用 OpenSSL 的应用程序需要类似上述 sslkeylog.sh 方法。

演练

sslkeylog.so库特定于 OpenSSL 版本。版本 1.0.2( Debian Stretch 中的libssl1.0.2 )与 OpenSSL 1.1.0(Debian Stretch 中的libssl1.1)不兼容为了构建库,您需要相应的开发头文件。这些可通过相应版本的libssl1.0-devlibssl-dev包获得。

获取源代码和构建库应该很简单:

sudo apt install git make gcc libssl1.0-dev
git clone --depth=1 https://git.lekensteyn.nl/peter/wireshark-notes
cd wireshark-notes/src
make
# Optional: install to a specific location. Adjust paths below if you skip this.
sudo install libsslkeylog.so /usr/local/lib/

这会libsslkeylog.so在您的当前目录中生成一个文件。要测试它是否有效:

$ ./sslkeylog.sh curl https://example.com -sI
CLIENT_RANDOM ... ...    <-- expected for TLS 1.2
HTTP/2 200 
...
$ ldd /usr/bin/curl | grep ssl
libssl.so.1.0.2 => /usr/lib/x86_64-linux-gnu/libssl.so.1.0.2 (0x00007fc5a088d000)

最后一个命令显示程序链接到的 libssl 版本。我们可以为 Apache 做类似的事情。主程序(apache2)通过不同的库加载 TLS 支持,所以我们必须检查:

$ ldd /usr/lib/apache2/modules/mod_ssl.so | grep ssl
libssl.so.1.0.2 => /usr/lib/x86_64-linux-gnu/libssl.so.1.0.2 (0x00007f8dbb6ed000)

如果这显示 libssl.so.1.1 出于某种原因,那么您将不得不sudo apt install libssl-dev改为使用make -B.

下一步是修改apache2服务的 systemd 单元文件。Execute systemctl edit apache2,这会打开一个编辑器/etc/systemd/system/apache2.service.d/override.conf,您应该在其中添加:

[Service]
Environment=LD_PRELOAD=/usr/local/lib/libsslkeylog.so
Environment=SSLKEYLOGFILE=/tmp/your.keys

重新启动 ( sudo systemctl restart apache2) 后,您的密钥现在将在/tmp/systemd-private-*-apache2.service-*/tmp/your.keys. 如果您想要更短的路径,您可以输入类似 的内容/home/user/your.keys,但请确保该文件可由www-data用户写入。

确保在测试完成后将其删除。我建议临时修改客户端来执行这种测试。如上所示,sslkeylog.sh也适用于客户端。