
Ich versuche, die Verwendung einer LD_PRELOAD
-basierten Lösung zu vermeiden, und die Haproxy-Dokumentation scheint anzudeuten, dass es möglich ist, eine SSL-Keylog-Datei zu erstellen, ohne tatsächlich zu sagen, wie.
Ich weiß, dass die Informationen sozusagen „zur Verfügung gestellt“ werden können mittune.ssl.keylogDas Dokument enthält alle Beispiele, die für eine Standard-Keylog-Datei wie beispielsweise erforderlich ssl_fc_server_traffic_secret_0
sind SERVER_TRAFFIC_SECRET_0
.
Aber was dann? Wie richte ich eine „Log“-Ausgabe ein, die jedes Element im richtigen Format in eine eigene Zeile setzt?
Antwort1
So habe ich es auf eine etwas umständliche und umständliche Art und Weise herausgefunden. Sie ist nicht besonders gut:
Erstellen Sie eine Lua-Datei 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)
Dies ist geändert vondas Originalvon dem ich nicht sicher bin, ob es jemals funktioniert hat. Es protokolliert alle Sitzungsschlüssel als Warnungen, die in die regulären HAProxy-Protokolle aufgenommen werden sollten.
In der HAProxy-Konfiguration:
global
tune.ssl.keylog on
lua-load path/to/sslkeylogger.lua
frontend foobar
http-request lua.sslkeylog
Dann müssen Sie die Protokolle abrufen (sofern sie in systemd vorhanden sind journalctl -u haproxy
) und nur nach relevanten Protokollzeilen filtern und alle Zeitstempel oder andere davor stehende Informationen EXPORTER_SECRET
usw. entfernen. Genauer kann ich nichts sagen, da es von der Protokollierungskonfiguration abhängt. Danach haben Sie eine Datei, die Sie in Kombination mit einem Paket-Dump an Wireshark übergeben können, um die Daten abzurufen.