如何在 HAProxy 中记录 TLS 会话密钥(SSLKEYLOGFILE)

如何在 HAProxy 中记录 TLS 会话密钥(SSLKEYLOGFILE)

我试图避免使用LD_PRELOAD基于的解决方案,而 haproxy 文档似乎暗示可以创建 sslkeylog 文件,但实际上并没有说明如何操作。

我知道信息可以通过以下方式“提供”tune.ssl.keylog其中有文档讨论标准键盘记录文件所需的所有示例,ssl_fc_server_traffic_secret_0例如SERVER_TRAFFIC_SECRET_0

但之后呢?如何设置“日志”输出,让每一项都以正确的格式放在自己的行上?

答案1

这是我想出的一种粗糙、笨拙的方法。这种方法不太好:

创建一个lua文件sslkeylogger.lua

local function sslkeylog(txn)
    local fields = {
        CLIENT_EARLY_TRAFFIC_SECRET     = function() return txn.f:ssl_fc_client_early_traffic_secret()     end,
        CLIENT_HANDSHAKE_TRAFFIC_SECRET = function() return txn.f:ssl_fc_client_handshake_traffic_secret() end,
        SERVER_HANDSHAKE_TRAFFIC_SECRET = function() return txn.f:ssl_fc_server_handshake_traffic_secret() end,
        CLIENT_TRAFFIC_SECRET_0         = function() return txn.f:ssl_fc_client_traffic_secret_0()         end,
        SERVER_TRAFFIC_SECRET_0         = function() return txn.f:ssl_fc_server_traffic_secret_0()         end,
        EXPORTER_SECRET                 = function() return txn.f:ssl_fc_exporter_secret()                 end,
        EARLY_EXPORTER_SECRET           = function() return txn.f:ssl_fc_early_exporter_secret()           end
    }

    local client_random = txn.c:hex(txn.f:ssl_fc_client_random())

    -- ensure that a key is written only once by using a session variable
    if not txn:get_var('sess.sslkeylogdone') then
        for fieldname, fetch in pairs(fields) do
            if fetch() then
                core.Warning(string.format('SSLKEYLOG:: %s %s %s\n', fieldname, client_random, fetch()))
            end
        end

        txn:set_var('sess.sslkeylogdone', true)
    end
end

core.register_action('sslkeylog', { 'http-req' }, sslkeylog)

这是修改自原本的我不确定它是否真的有效。它会将所有会话密钥记录为警告,这些警告应该记录到常规 HAProxy 日志中。

在 HAProxy 配置中:

global
  tune.ssl.keylog on
  lua-load path/to/sslkeylogger.lua

frontend foobar
  http-request lua.sslkeylog

然后,您需要抓取日志(如果它们在 systemd 中journalctl -u haproxy),并仅过滤相关日志行,并删除之前的任何时间戳或其他信息EXPORTER_SECRET。我无法更具体,因为这取决于日志设置。完成此操作后,您将获得一个文件,您可以将其与数据包转储结合提供给 wireshark 以获取数据。

相关内容