2016-04-26 12 views
1

Ich habe eine C-Server-Anwendung, die OpenSSL verwendet, und ich empfange den gesamten Verkehr auf dem gleichen Port. Gibt es eine sichere Möglichkeit zu überprüfen, ob eingehende Daten eine SSL-Verbindung oder etwas anderes sind?Wie überprüft man, ob eine Verbindung SSL ist?

+1

Meinen Sie, dass Sie alle Verbindungen im Server mit einem einzigen Port akzeptieren, und führen Sie anschließend eine SSL-Verhandlung durch, sobald Sie die Verbindung akzeptiert haben? Sie verwenden die Bibliothekenfunktionen nicht, um die Verbindung für Sie zu verwalten? –

+0

Ja genau. Ich sollte entscheiden, welche Art von Verkehr ist und dann, wenn es SSL ist, die SSL-Verhandlung, andernfalls behandeln Sie es auf andere Weise. – Marco

Antwort

2

Das erste, was bei einer TLS-Verbindung passiert, ist der Client, der einen ClientHello sendet. Der ClientHello beginnt mit einem Byte-Wert 22 ('\x16'), der es als eine Handshake-Nachricht identifiziert.

Wenn Ihr Anwendungsprotokoll textbasiert ist, enthält es keine 22 Bytes (es handelt sich nicht um ein druckbares Zeichen), so dass das erste Byte ausreicht, um Ihr Protokoll-über-TCP von Ihrem Protokoll-over zu unterscheiden -TLS-über-TCP.

Wenn Ihr Anwendungsprotokoll nicht textbasiert ist und eine Nicht-TLS-Verbindung mit dem Senden eines 22 Bytes durch den Client beginnen kann, müssen Sie tiefer einsteigen. Die nächsten 2 Bytes sind die TLS-Haupt- und Nebenversionsnummern; Derzeit können Sie erwarten, dass das Hauptversions-Byte 3 ist und das Nebenversions-Byte irgendwo im Bereich 1 bis 3 liegt. Niedrigere Zahlen sind möglich, wenn Kunden veraltete, kaputte Versionen von SSL verwenden und höhere Nummern mit zukünftigen Aktualisierungen von TLS möglich werden. Daher müssen Sie flexibel sein.

Hoffentlich können Sie nur 22 als das erste Byte der Nicht-TLS-Version Ihres Protokolls ausschließen.

Sie können recv mit MSG_PEEK verwenden, das erste Byte zu inspizieren, ohne es zu aufwendig, so, nachdem Sie die Entscheidung getroffen haben es immer noch da für die TLS-Bibliothek sein wird oder Ihr Anwendungsprotokoll zu lesen.

Eine weitere mögliche Komplikation: Wenn Ihr Anwendungsprotokoll erfordert, dass der Server vor dem Client spricht, liegt ein Problem vor. Nachdem der Client eine Verbindung hergestellt hat, wartet er möglicherweise auf Ihre Nicht-TLS-Begrüßung oder sendet möglicherweise einen ClientHallo. Dieses Problem kann nur durch eine Zeitüberschreitung behoben werden - wenn der Client innerhalb eines bestimmten Zeitraums nichts sendet, wird angenommen, dass er kein ClientHello sendet und mit der Nicht-TLS-Version des Protokolls fortfährt. Dies bestraft Nicht-TLS-Clients mit einer Verzögerung beim Verbindungsstart, aber es gibt keine Möglichkeit, dies zu vermeiden.

+1

... und hören wir alle auf, den Namen "SSL" für das Protokoll zu verwenden, wenn wir uns nicht auf die alten kaputten Versionen beziehen. TLS ist schon da! –

+0

Vielen Dank, das ist genau die Antwort, nach der ich gesucht habe! – Marco

0

Wenn Sie die Verbindungen selbst akzeptieren und nach der Annahme der Verbindung zum SSL-Handshaking übergeben, müssen Sie dies selbst verfolgen.

Eine einfache Lösung besteht darin, eine Struktur zu haben, die den akzeptierten Socket-Deskriptor und ein boolesches Flag enthält, wenn es sich um eine SSL-Verbindung handelt oder nicht, und eine Liste dieser Strukturen zu haben.

Verwandte Themen