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

如何在HAProxy中记录TLS会话密钥(类似SSLKEYLOGFILE功能)且不使用LD_PRELOAD方案

如何在HAProxy中记录TLS会话密钥(类似SSLKEYLOGFILE功能)且不使用LD_PRELOAD方案

我明白你想绕开LD_PRELOAD来让HAProxy生成标准的SSL密钥日志文件,而且已经注意到tune.ssl.keylog相关的文档提到了所需的采样字段,但不知道怎么把这些字段整合成正确格式的日志输出——这确实是HAProxy文档里没说透的地方,我来一步步教你怎么做。

前置要求

首先得确认你用的是HAProxy 2.3或更高版本,因为tune.ssl.keylog相关的采样器是从这个版本才开始引入的,老版本没有这个功能哦。

具体配置步骤

  1. 全局开启密钥日志采样
    在HAProxy的global配置块中添加以下指令,让HAProxy生成TLS密钥相关的采样字段:

    global
        tune.ssl.keylog on
    
  2. 定义符合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会话密钥。

  3. 配置日志输出到文件
    在需要记录密钥的frontend(或backend)块中,用customlog指令把刚才定义的格式输出到指定文件:

    frontend https_frontend
        bind *:443 ssl crt /etc/haproxy/certs/
        # 输出SSL密钥日志到指定文件
        customlog file:/var/log/haproxy/ssl_keylog.log ssl_keylog
    
  4. 确保文件权限正确
    要保证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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 10:24:34