Wie würden Sie die Servernamenanzeige aus einer TLS-Client-Hello-Nachricht extrahieren? Ich habe derzeit Mühe, diese sehr kryptische RFC 3546 auf TLS Extensions, in welcher der SNI definiert ist.
Dinge, die ich bisher verstanden habe:
Wenn ich die genaue Position dieses Längenbytes herausfinden könnte, wäre das Extrahieren des SNI ziemlich einfach. Aber wie komme ich überhaupt zu diesem Byte?
Ich tat dies in sniproxy und untersuchte dabei ein TLS-Client-Hallo-Paket in Wireshark Lesen, dass RFC ist ein ziemlich guter Weg zu gehen. Es ist nicht zu schwer, nur viele Felder variabler Länge müssen Sie überspringen und überprüfen, ob Sie den richtigen Elementtyp haben.
Ich arbeite gerade an meinen Tests und habe dieses annotierte Beispielpaket, das helfen könnte:
%Vor% Verwenden Sie WireShark und erfassen Sie nur TLS (SSL) -Pakete, indem Sie einen Filter tcp port 443
hinzufügen. Dann finden Sie eine "Client Hallo" Nachricht. Sie können seine Rohdaten unten sehen.
Erweitern Secure Socket Layer
->
TLSv1.2 Record Layer: Handshake Protocol: Client Hello
->
...
und Sie werden Extension: server_name
->
Server Name Indication extension
sehen. Der Servername im Handshake-Paket ist nicht verschlüsselt.
Ich habe bemerkt, dass die Domäne immer von zwei Nullbytes und einem Längenbyte vorangestellt wird. Vielleicht ist es 24-Bit-Ganzzahl ohne Vorzeichen, aber ich kann es nicht testen, da mein DNS-Server keine Domänennamen mit mehr als 77 Zeichen zulässt.
Nach diesem Wissen kam ich auf diesen (Node.js) Code.
%Vor%Dieser Code sucht nach einer Folge von zwei Nullbytes. Wenn es eins findet, nimmt es an, dass das folgende Byte ein Längenparameter ist. Es prüft, ob sich die Länge noch in der Puffergrenze befindet und liest die Bytefolge als UTF-8. Später konnte man das Array regieren und die Domain extrahieren.
Funktioniert erstaunlich gut! Trotzdem bemerkte ich etwas Seltsames.
%Vor%Immer, egal welche Subdomain ich wähle, wird die Domain doppelt ausgerichtet. Es scheint, als ob das SNI-Feld in einem anderen Feld verschachtelt ist.
Ich bin offen für Vorschläge und Verbesserungen! :)
Ich habe dies in ein Knotenmodul verwandelt, für alle, die sich interessieren: sni .
Tags und Links language-agnostic ssl binary-data rfc protocols