Fehler­be­he­bung bei SSL/TLS-Verbin­dungen

In letzter Zeit haben uns mehrere Support-Anfragen zu demselben Problem erreicht: Eine TLS/SSL-gesi­cherte Verbin­dung kommt nicht zustande. Dieser Artikel soll mögliche Ursa­chen und Lösungs­mög­lich­keiten aufzeigen.

Zum besseren Verständnis: Eine kurze Einfüh­rung in TLS/SSL

TLS steht für “Trans­port Layer Secu­rity” und ist ein Proto­koll, mit dem TCP-Verbin­dungen abge­si­chert werden. Es bietet auf einer TCP-Verbin­dung eine Ende-zu-Ende Verschlüs­se­lung an, sorgt für Daten­in­te­grität (stellt also sicher, dass über­tra­gene Nach­richten nicht verän­dert werden) und ermög­licht eine gegen­sei­tige Authen­ti­fi­zie­rung der Kommu­ni­ka­ti­ons­partner mit Hilfe von Zerti­fi­katen. Entwi­ckelt wurde es vom Unter­nehmen “Netscape Commu­ni­ca­tions” unter dem Namen “SSL” (Secure Socket Layer) und wird seit der Version “SSL3” unter dem Namen TLS stan­dar­di­siert und weiter­ent­wi­ckelt. Die aktu­elle Version ist TLSv1.2.
Eine mit TLS abge­si­cherte Verbin­dung wird mit Hilfe eines Hand­shakes aufge­baut. Hierbei durch­laufen Server und Client folgende Aufgaben:

  • Über­prü­fung des Server-Zerti­fi­kats durch den Client
  • optional: Über­prü­fung des Client-Zerti­fi­kats durch den Server
  • Eini­gung auf die verwen­dete  TLS/SSL-Version
  • Eini­gung auf ein gemein­sames Verschlüs­se­lungs- und Signa­tur­ver­fahren (Cipher-Suite)
  • Gene­rie­rung eines gemein­samen geheimen Schlüs­sels (Master-Key) für die Session

Der Hand­shake startet mit der Nach­richt Client Hello, die der Client an den Server sendet. Hierbei enthalten ist unter anderem die höchste SSL/TLS-Version, die der Client unter­stützt, sowie eine Liste der durch den Client unter­stützten Verschlüs­se­lungs- und Signa­tur­ver­fahren (soge­nannte “Cipher-Suites”). Der Server antwortet daraufhin mit der Nach­richt Server Hello, die die verwen­dete Cipher Suite und SSL/TLS-Version, die für die Verbin­dung verwendet werden soll, enthält. In einer weiteren Nach­richt sendet der Server sein SSL/TLS-Zerti­fikat an den Client, das vom Client über­prüft wird. Anschlie­ßend findet die Aushand­lung eines gemein­samen geheimen Schlüs­sels statt, der für die Verbin­dung verwendet werden soll. Nach Abschluss des Hand­shakes wird mit einer Nach­richt auf die ausge­han­delte Cipher Suite gewech­selt und die weitere Verbin­dung findet verschlüs­selt statt.

Mögliche Probleme

Kommt eine per TLS/SSL gesi­cherte Verbin­dung nicht zustande, kann dies unter anderem folgende Ursa­chen haben:

  • Die TCP Verbin­dung zum Server und dem entspre­chenden Port ist nicht möglich
  • Das Server­zer­ti­fikat konnte durch den Client nicht veri­fi­ziert werden
  • Die Eini­gung auf eine gemein­same Cipher Suite war nicht erfolgreich
  • Die Eini­gung auf eine gemein­same TLS/SSL-Version war nicht erfolgreich

Gerade der letzte Punkt - die Eini­gung auf eine gemein­same TLS/SSL-Version - ist nach Bekannt­werden der Sicher­heits­lücke Poodle und dem Deak­ti­vieren bestimmter SSL-Versionen in unserem Umfeld häufig aufge­treten. Auf dem Server werden dabei ältere SSL-Versionen (in der Regel SSLv2 und SSLv3) deak­ti­viert. Ein TLSv1.2 Client, der neben der aktu­ellen Version auch noch SSLv2 unter­stützen möchte, muss nach dem RFC5246 die Nach­richt Client Hello im Hand­shake selbst in der Version SSLv2 senden (http://tools.ietf.org/html/rfc5246#appendix-E.2). Der Server muss diese Nach­richt entge­gen­nehmen und verar­beiten, auch wenn er selbst SSLv2 für die spätere Verbin­dung nicht zulassen möchte. In einigen Projekten und Support­an­fragen gab es in der letzten Zeit aus diesem Grund einen Hand­shake Failure - die TLS-Verbin­dung kam nicht zustande.

Analy­se­mög­lich­keiten

Um eine fehler­hafte Verbin­dung zu analy­sieren, gibt es verschie­dene Möglichkeiten:

  • Über­prü­fung des Aufbaus der TCP-Verbin­dung (telnet)
  • Über­prü­fung des Aufbaus der TLS-Verbin­dung (openssl s_client)
  • Weitere Über­prü­fung mit wire­shark

Zuerst kann geprüft werden, ob über­haupt eine TCP-Verbin­dung vom Client zum Server aufge­baut wird. Dies kann mit dem Tool telnet geschehen. Folgender Befehl testet den Verbin­dungs­aufbau zu einem Server (in unserem Beispiel 10.9.24.11 auf Port 443):

root@test1:~# telnet 10.9.24.11 443
Trying 10.9.24.11...
Connected to 10.9.24.11.
Escape character is '^]'.

Erhält man die oben stehende Ausgabe, hat der Verbin­dungs­aufbau funk­tio­niert. Im Falle einer unver­schlüs­selten Verbin­dung könnte man nun direkt mit der jewei­ligen Anwen­dung auf dem Server kommunizieren.
 
Der Aufbau der TLS-Verbin­dung mit dem Hand­shake kann mit dem Tool openssl s_client getestet werden. Folgender Befehl stellt eine TLS-gesi­cherte Verbin­dung zu einem Server her:

openssl s_client -connect 10.9.24.11:443

Hiermit kann man testen, ob der TLS-Hand­shake richtig durch­ge­führt wird. Kommt eine Verbin­dung zustande, lässt sich das Tool anschlie­ßend wie Telnet verwenden und man kann direkt mit der jewei­ligen Anwen­dung auf dem Server kommunizieren.
 
Kommt hierbei keine Verbin­dung zustande, gibt die Ausgabe des Tools gege­ben­falls Hinweise auf die Ursache. Um zu über­prüfen, ob die Eini­gung auf eine gemein­same SSL/TLS-Version nicht möglich ist, kann man durch die Angabe eines Para­me­ters eine bestimmte SSL/TLS-Version erzwingen:

openssl s_client -connect 10.9.24.11:443 -ssl2
openssl s_client -connect 10.9.24.11:443 -ssl3
openssl s_client -connect 10.9.24.11:443 -tls1

Kommt mit TLSv1 als erzwun­gene Version nun eine Verbin­dung zustande, lässt sich das Problem vermut­lich darauf zurück­führen, dass der Server keine SSLv2 Client Hello Messages untersützt.
 
Weitere Analysen lassen sich mit dem Mitschneiden von Netz­werk­traffic mit den Tools tcpdump / Wire­shark durch­führen. Mit folgendem Befehl werden die Pakete voll­ständig mitge­schnitten und in eine Ausga­be­datei geschrieben:

tcpdump -s 0 -w output.pcap

Die mitge­schnit­tenen Pakete lassen sich anschlie­ßend mit dem Tool Wire­shark genauer ansehen und analysieren.

Lösungs­an­sätze

Je nach ermit­telter Ursache sollte zunächst die Server­kon­fi­gu­ra­tion über­prüft werden. Folgende Fragen sollte man dabei durchgehen:

  • Problem: Das Server­zer­ti­fikat konnte durch den Client nicht veri­fi­ziert werden. 
    • Ist das Zerti­fikat noch gültig?
    • Ist das Zerti­fikat für den Host ausgestellt?
    • Ist das Zertifkat von einer vertrau­ens­wür­digen Zerti­fi­zie­rungs­stelle ausgestellt?
  • Problem: Die Eini­gung auf eine gemein­same TLS/SSL-Version war nicht erfolgreich. 
    • Sind alte SSL-Versionen (SSLv2 und SSLv3) deaktiviert?
    • Wird SSLv2 Client Hello unterstützt?

Manchmal hat man keine Möglich­keit, die Konfi­gu­ra­tion des Servers zu verän­dern. Dann gibt es folgende Möglichkeiten:

  • Problem: Das Server­zer­ti­fikat konnte durch den Client nicht veri­fi­ziert werden. 
    • Veri­fi­zie­rung des Servers deaktivieren.
  • Problem: Die Eini­gung auf eine gemein­same TLS/SSL-Version war nicht erfolgreich. 
    • Eine bestimmte SSL/TLS-Version im Client zu erzwingen.

 Weiter­füh­rende Links

Schreibe einen Kommentar

Cookie Einstellungen
Diese Website verwendet Cookies, um die bestmögliche Funktionalität zu gewährleisten. Mehr lesen

Akzeptiere alle Cookies Speichern