如何在HAProxy中记录TLS会话密钥(类似SSLKEYLOGFILE功能)且不使用LD_PRELOAD方案
如何在HAProxy中记录TLS会话密钥(类似SSLKEYLOGFILE功能)且不使用LD_PRELOAD方案
我明白你想绕开LD_PRELOAD来让HAProxy生成标准的SSL密钥日志文件,而且已经注意到tune.ssl.keylog相关的文档提到了所需的采样字段,但不知道怎么把这些字段整合成正确格式的日志输出——这确实是HAProxy文档里没说透的地方,我来一步步教你怎么做。
前置要求
首先得确认你用的是HAProxy 2.3或更高版本,因为tune.ssl.keylog相关的采样器是从这个版本才开始引入的,老版本没有这个功能哦。
具体配置步骤
全局开启密钥日志采样
在HAProxy的global配置块中添加以下指令,让HAProxy生成TLS密钥相关的采样字段:global tune.ssl.keylog on定义符合SSLKEYLOG格式的自定义日志模板
SSLKEYLOGFILE的标准格式是每行以密钥类型开头,后跟客户端/服务器随机值和对应的密钥,比如:CLIENT_RANDOM <随机值> <密钥> SERVER_TRAFFIC_SECRET_0 <随机值> <密钥>我们需要在HAProxy中定义一个匹配这个格式的日志模板,还可以通过条件判断只输出存在的密钥条目,避免空行:
# 可以放在defaults或frontend/backend块中 log-format ssl_keylog "%+[if exists(ssl_fc_client_traffic_secret_0)]CLIENT_RANDOM %[ssl_fc_client_random] %[ssl_fc_client_traffic_secret_0]\n%+[if exists(ssl_fc_server_traffic_secret_0)]SERVER_TRAFFIC_SECRET_0 %[ssl_fc_server_random] %[ssl_fc_server_traffic_secret_0]\n%+[if exists(ssl_fc_client_traffic_secret_1)]CLIENT_TRAFFIC_SECRET_1 %[ssl_fc_client_random] %[ssl_fc_client_traffic_secret_1]\n%+[if exists(ssl_fc_server_traffic_secret_1)]SERVER_TRAFFIC_SECRET_1 %[ssl_fc_server_random] %[ssl_fc_server_traffic_secret_1]"这里用到的采样字段都是HAProxy官方文档提到的,对应不同类型的TLS会话密钥。
配置日志输出到文件
在需要记录密钥的frontend(或backend)块中,用customlog指令把刚才定义的格式输出到指定文件:frontend https_frontend bind *:443 ssl crt /etc/haproxy/certs/ # 输出SSL密钥日志到指定文件 customlog file:/var/log/haproxy/ssl_keylog.log ssl_keylog确保文件权限正确
要保证HAProxy运行的用户(通常是haproxy)对日志文件所在目录有写入权限,否则会无法生成日志。可以提前创建文件并修改权限:touch /var/log/haproxy/ssl_keylog.log chown haproxy:haproxy /var/log/haproxy/ssl_keylog.log
完整配置示例
global tune.ssl.keylog on log /dev/log local0 defaults mode http log global option httplog # 定义SSL密钥日志格式 log-format ssl_keylog "%+[if exists(ssl_fc_client_traffic_secret_0)]CLIENT_RANDOM %[ssl_fc_client_random] %[ssl_fc_client_traffic_secret_0]\n%+[if exists(ssl_fc_server_traffic_secret_0)]SERVER_TRAFFIC_SECRET_0 %[ssl_fc_server_random] %[ssl_fc_server_traffic_secret_0]\n%+[if exists(ssl_fc_client_traffic_secret_1)]CLIENT_TRAFFIC_SECRET_1 %[ssl_fc_client_random] %[ssl_fc_client_traffic_secret_1]\n%+[if exists(ssl_fc_server_traffic_secret_1)]SERVER_TRAFFIC_SECRET_1 %[ssl_fc_server_random] %[ssl_fc_server_traffic_secret_1]" frontend https_frontend bind *:443 ssl crt /etc/haproxy/certs/ # 输出SSL密钥日志到文件 customlog file:/var/log/haproxy/ssl_keylog.log ssl_keylog default_backend web_servers backend web_servers server web1 192.168.1.10:80 check
额外注意事项
- 生成的
ssl_keylog.log文件和浏览器、OpenSSL生成的SSLKEYLOGFILE格式完全兼容,可以直接在Wireshark等抓包工具中指定这个文件来解密TLS流量。 - 如果需要记录更多类型的密钥,可以参考HAProxy文档添加对应的采样字段,格式和上面的条目一致即可。
- 这个方案完全依赖HAProxy自身功能,不需要任何LD_PRELOAD技巧,完美符合你的需求。
备注:内容来源于stack exchange,提问作者Shelvacu
相关产品推荐
相关产品推荐

