
Я пытаюсь избежать использования 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 в сочетании с дампом пакетов для получения данных.