我试图避免使用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 以获取数据。