
我試圖避免使用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以獲取資料。