如何在 HAProxy ala SSLKEYLOGFILE 中記錄 TLS 會話金鑰

如何在 HAProxy ala SSLKEYLOGFILE 中記錄 TLS 會話金鑰

我試圖避免使用LD_PRELOAD基於 - 的解決方案,並且 haproxy 文檔似乎暗示可以製作 sslkeylog 文件,而無需實際說明如何製作。

我知道這些資訊可以透過以下方式“提供”調整.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以獲取資料。

相關內容