PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


TLS 1.0/1.1 Abschaltung: Eigene Versionsverteilung herausfinden und serverseitig abschalten

without comments

Browserhersteller planen, ab 2020 die TLS-Versionen 1.0 und 1.1 nicht mehr zu unterstützen:

https://www.heise.de/security/meldung/Verschluesselung-im-Web-Chrome-Firefox-Co-verabschieden-sich-von-TLS-1-0-1-1-4191864.html
https://www.golem.de/news/https-browser-wollen-alte-tls-versionen-2020-abschalten-1810-137135.html

Mit den richtigen Einstellungen und Ciphers ist TLS 1.0 noch sicher zu betreiben, aber man muss es eben richtig konfigurieren, wenn man alles beachten will: BEAST, POODLE, Sloth, DROWN, CRIME und BREACH, RC4, MD5, ROBOT, Sweet32, Bleichenbacher, Heartbleed, FREAK und Logjam, …

Da es schon ein Dutzend Probleme gab in den letzten Jahren, möchte man sich des Problems lieber früher als später entledigen, gern bevor es zum großen Knall kommt. TLS 1.2 ist nicht gegen all diese Probleme gewappnet, man muss nach wie vor aufpassen wie man die Ciphers konfiguriert. Aber man kann weniger Fehler machen. Und das Ziel ist es, TLS 1.3 zu nutzen, wo all dieses Probleme gelöst sind, da alles unsichere radikal entfernt wurde, und nicht mehr 100 Ciphers zur Auswahl stehen, sondern nur noch eine Handvoll. Weniger Auswahl ist eben manchmal besser.

Ich schrieb 2014 über die Abschaltung von SSLv3, und im Dezember 2017 darüber, dass ab dem 30. Juni 2018 im Kreditkarten-/Payment-Bereich TLS 1.2 als Minimum genutzt werden muss.

Auch das BSI fordert bzw. empfiehlt den Behörden, TLS 1.2 als Minimum zu nutzen („fordert“ bei Neusystemen, „empfiehlt“ bei Altsystemen, aber auch nur wenn es den Bürgern zugemutet werden kann… Also recht schwammig das ganze).

Nun ist es Zeit, sich über TLS 1.0 und 1.1 Gedanken zu machen, auch für Seiten, die nicht durch Kreditkartenkonsortien dadurch gezwungen werden. Und es ist gut, sich damit zu beschäftigen: TLS 1.0 stammt aus dem Jahr 1999, TLS 1.1 aus 2006, und TLS 1.2 aus 2008.

Prozentuale Verteilung von TLS 1.0, 1.1 und 1.2 herausfinden

Einige Browserhersteller nennen Daten ihrer Nutzer:

Mozilla:
– TLS 1.3: 5%
– TLS 1.2: 93%
– TLS 1.0: 1,1%
– TLS 1.1: 0,09%

Chrome:
– TLS 1.0 + 1.1: 0,5%

Safari:
– TLS 1.0 + 1.1: 0,36%

Eine weitere Statistik bietet caniuse.com, bei der auch mobile Browser einbezogen werden:

NICHT kompatibel mit TLS 1.2 sind (Quelle):

Desktop IE Versionen 8, 9, und 10 auf Windows Vista und älter
Desktop IE Versionen 7 und darunter
Mobile IE Versionen 10 und darunter
Firefox 26 und darunter
Google Chrome 22 bis 37 auf Windows XP SP2 und älter
Google Chrome 21 und darunter
Android 4.4 (KitKat), je nach Gerät
Android 4.3 (Jelly Bean) und darunter
Desktop Safari Versionen 6 und darunter für OS X 10.8 (Mountain Lion) und darunter

Eigentlich alles Browser bzw. Betriebssysteme, die niemand mehr nutzen sollte 🙂

Wer den Verdacht hat, dass sein Browser kein TLS 1.2 unterstützt, kann den Client-Test von Qualys nutzen, und sich die Sicherheitsfeatures des eigenen Browsers anzeigen lassen.

Am einfachsten prüft man die aktuelle Verteilung der TLS-Versionen der eigenen Webseitenbesucher mit Hilfe des Webserver-Logs. Im nginx Webserver beispielsweise so:

log_format tls '$remote_addr - $remote_user [$time_local] "$request" '
  '$status $body_bytes_sent "$http_referer" '
  '"$http_user_agent" $http_host - $upstream_status - $upstream_addr [$request_time/$upstream_response_time] '
  '[SSL]: $ssl_protocol $ssl_cipher';
access_log /var/log/nginx/access_tls.log tls;

Im „log_format“ werden Variablen genutzt, um die SSL-Protokoll-Version und den genutzten Cipher in jeder Logzeile hinzuzufügen. Mit Hilfe der „access_log“ Zeile wird das gerade angelegte Format „tls“ in eine access_tls.log Datei geschrieben. Das Format der Original access.log zu ändern kann problematisch sein, wenn man mit Auswertungstools darauf zugreift, dann passt das Format evtl. nicht mehr. Deshalb mag es sinnvoller sein, es wie hier im Beispiel in eine separate Datei zu schreiben, die man auch nur einige Tage mitlaufen lässt, denn im Normalfall benötigt man diese Informationen nicht (außer man interessiert sich dafür 🙂 )

Mit ein paar grep-Befehlen oder einem kurzen PHP-Analyse-Script sollte sich nun herausfinden lassen, wie sich der Traffic auf die jeweiligen TLS-Versionen verteilt.

Man kann es auch mittels Javascript herausfinden, und das Ergebnis an den Server senden. Mehr dazu unten.

Sind es nur sehr wenige Nutzer, oder alte Bots auf der Suche nach E-Mail-Adressen, die noch TLS 1.0 nutzen, kann man TLS abschalten, eventuell nach vorheriger Ankündigung für die Nutzer. Doch was tun, wenn es zu viele Nutzer sind, die es noch nutzen?

Eine Warnung anzeigen via Javascript

Mit einem kleinen Javascript kann Nutzern angezeigt werden, dass ihr Browser noch kein TLS 1.2 beherrscht (also die Webseite via TLS 1.0/1.1 aufruft). Hier ein Beispiel:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>

<script type="application/javascript">
    jQuery('<img />').on({
        load: function() {
            alert("This browser supports TSL 1.2");
        },
        error: function() {
            alert('This browser does not support TSL 1.2');
        }
    }).attr('src','https://tls1.2.only.host.de/some.png');
</script>

(Aufgabe an die Leser: browserübergreifende Umsetzung ohne das überfrachtete jQuery zu nutzen 🙂 )

Das Script muss natürlich angepasst werden, ein „alert()“ ist keine schöne Anzeige. Besser wäre es, eine auffällige Box anzuzeigen mit einer ausführlichen Erklärung, Links zu Test- und Hilfeseiten usw.

Außerdem muss für die URL des Bildes eine Domain genommen werden, die nur TLS 1.2 unterstützt. Entweder man hat bereits eine, oder fragt jemanden der eine solche Domain hat, oder schaltet beispielsweise Cloudflare vor eine Domain, und setzt dort die TLS-Minimum-Version auf TLS 1.2. Man sollte darauf achten, einen TLS1.2-only-Webserver zu nehmen, der 24/7 online ist, denn wenn der Webserver nicht antwortet und das Bild nicht geladen werden kann, gibt es sonst falsche Ergebnisse bzw. Warnungen.

Statt dem User die Warnung anzuzeigen, kann der Javascript-Code auch zur Ermittlung der TLS 1.2 Unterstützung genutzt werden. Ein (ungetestetes) Beispiel:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>

<script type="application/javascript">
    jQuery('<img />').on({
        load: function() {
            jQuery('<img />').attr('src','https://meinewebsite.de/tlsinfo.php?v=1.2');
        },
        error: function() {
            jQuery('<img />').attr('src','https://meinewebsite.de/tlsinfo.php?v=no1.2');
        }
    }).attr('src','https://tls1.2.only.host.de/some.png');
</script>

meinewebsite.de sollte natürlich TLS 1.0 und 1.2 unterstützen, sonst klappt es nicht. In der tlsinfo.php schreibt man den erhaltenen „v“ Parameter z.B. in eine Datenbank, und zählt die Vorkommnisse (man sollte doppelte Requests von IP-Adressen vermutlich rausfiltern).

OK, wir haben nur noch wenige Nutzer, die noch TLS 1.0/1.1 benötigen, wir schalten es ab.

TLS 1.0 und 1.1 im Webserver abschalten

Kurz und bündig:

nginx:
ssl_protocols TLSv1.2;

Apache:
SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1

Obiges ist besser als
SSLProtocol TLSv1.2
denn wenn in Zukunft TLSv1.3 in „All“ aufgenommen wird, ist es bereits frühestmöglich aktiv, und muss nicht manuell hinzugefügt werden.

Man sollte sich natürlich sicher sein, dass dann noch TLS 1.2 übrig bleibt, das Betriebssystem bzw. OpenSSL sollte nicht zu alt sein (OpenSSL >= 1.0.1 bietet TLS 1.2). Ein kurzer Test vorher und nachher ist eine gute Idee:
https://www.ssllabs.com/ssltest/
https://sslanalyzer.comodoca.com/

Besonders zu beachten sind die unterstützten TLS-Versionen und die Ciphers. Natürlich bietet es sich auch an, alle anderen verbesserungswürdigen Einstellungen anzupassen, aber das sollte man eh ab und zu mal prüfen.

Noch ist das ganze nicht wirklich dringend, selbst 2020 wird es keine Probleme geben wenn man bis dahin TLS 1.2 unterstützt. Doch ich finde, es ist langsam an der Zeit, TLS 1.0 und 1.1 den Laufpass zu geben, und das lieber kontrolliert zu tun, als überhastet im Notfall. Wer weiß, vielleicht ist TLS 1.0 ja auch bereits gebrochen, nur wissen das bisher allein die Geheimdienste…

Written by Michael Kliewe

Oktober 17th, 2018 at 7:06 pm

Leave a Reply

You can add images to your comment by clicking here.