TLSv1.3 unter Ubuntu Server 18.04 LTS mit nginx

Let's Encrypt Logo

Moderne Webserver und Browser nutzen TLS (Transport Layer Security) für die verschlüsselte Datenübertragung (z.B. mittels HTTPS). Bereits im August 2018 wurde hier der neue Standard TLSv1.3 verabschiedet. TLSv1.3 bietet viele Vorteile bzw. Sicherheit und Performance: Es kommen moderne Krypto-Algorithmen zum Einsatz, ältere (und als unsicher geltende Algorithmen werden nicht mehr unterstützt). Ebenfalls kann der Verbindungsaufbau durch einen effizienteren Handshake schneller durchgeführt werden.

Allerdings war TLSv1.3 unter Ubuntu Server 18.04 LTS (mit nginx) lange Zeit nicht nutzbar. Dies lag zum einen daran, dass unter Ubuntu 18.04 mit OpenSSL 1.1.0 ausgeliefert wurde. Die Unterstützung für TLSv1.3 wurde allerdings erst in OpenSSL 1.1.1 hinzugefügt. Dieses Update auf Version 1.1.1 wurde allerdings zu einem späteren Zeitpunkt nachgeliefert. Zum anderen wird der Webserver nginx gegen eine bestimmte Version von OpenSSL gebaut. Erst mit dem Update vom 23.07.2019 (nginx 1.17.2 – Mainline-Version) kommt nun auch hier unter Ubuntu 18.04 OpenSSL 1.1.1 zum Einsatz.

Vor diesen Updates kursierten im Internet zahlreiche Anleitungen, wie man OpenSSL und nginx für die Unterstützung von TLSv1.3 selbst kompilieren und installieren konnte. Allerdings sollte man auf solche Aktionen gerade auf Produktiv-Systemen verzichten.

Mit den nun verfügbaren Updates kann nun auch endlich TLSv1.3 unter nginx auf Ubuntu Server 18.04 LTS genutzt werden. Dieser Artikel zeigt, was dabei zu beachten ist.

Update-Historie (letztes Update: 03.02.2020)
  • 03.02.2020:
    • Cipher Suite DHE-RSA-AES256-GCM-SHA384 entfernt.

Updates durchführen

Falls noch nicht geschehen, sollte das System zunächst einmal auf den aktuellen Stand gebracht werden:

apt-get update && apt-get upgrade -V && apt-get dist-upgrade && apt-get autoremove

Anschließend kann die Version von OpenSSL und nginx überprüft werden. Die Befehle dazu lauten wie folgt:

openssl version 
nginx -V

Hier sollte in beiden Fällen OpenSSL 1.1.1 angezeigt werden:

Informationen zu OpenSSL/nginx

In diesem Fall ist das System bereit für TLSv1.3.

TLSv1.3 in nginx aktivieren

Die Konfiguration für TLSv1.3 muss anschließend in den virtuellen Hosts von nginx aktiviert werden.

Hinweis: Ich gehe im Folgenden davon aus, dass der Webserver bereits für HTTPS mit Zertifikaten von Let’s Encrypt konfiguriert ist. Ebenfalls kommen sowohl ECDSA-, als auch RSA-Zertifikate im Hybrid-Betrieb zum Einsatz. Details dazu sind dem Artikel RSA und ECDSA-Zertifikate mit nginx (Hybrid-Lösung) zu entnehmen.

Die Konfiguration für SSL kann dabei direkt in den virtuellen Hosts erfolgen (meist zu finden unter /etc/nginx/conf.d). Für eine bessere Übersicht und die Möglichkeit, SSL-Konfigurationen für mehrere vHosts wiederzuverwenden, nutze ich hier allerdings eine eigene Konfigurations-Datei, welche anschließend in die virtuellen Hosts eingebunden wird (/etc/nginx/snippets/ssl.conf).

Für TLSv1.3 sind hier mehrere Dinge wichtig:

  • ssl_protocols TLSv1.2 TLSv1.3
    

    Hiermit wird die Unterstützung für TLSv1.2 und TLSv1.3 aktiviert. Wichtig: TLSv1.0 und TLSv1.1 sollten an dieser Stelle nicht mit aufgelistet werden, weil diese nicht mehr als sicher gelten.

  • ssl_ciphers '...'
    

    Definiert die sog. Cipher Suites. Diese müssen für TLSv1.3 entsprechend angepasst werden (die ersten beiden in der Liste sind speziell für TLSv1.3). Danaben wird hier ECDSA vor RSA bevorzugt.

  • ssl_ecdh_curve secp521r1:secp384r1
    

    Spezifiziert die „Kurve“ für ECDHE-Algorithmen. Hier sollte prime256v1 nicht mehr gelistet werden.

Alle anderen Einstellungen müssen nicht weiter angepasst werden, so dass die SSL-Konfiguration zusammenfassend so aussehen kann:

# Certificates used
# RSA
ssl_certificate /etc/letsencrypt/DOMAIN.de/rsa/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/DOMAIN.de/rsa/key.pem;

# ECC
ssl_certificate /etc/letsencrypt/DOMAIN.de/ecc/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/DOMAIN.de/ecc/key.pem;

# This should be ca.pem (certificate with the additional intermediate certificate)
# See here: https://certbot.eff.org/docs/using.html
ssl_trusted_certificate /etc/letsencrypt/DOMAIN.de/ecc/ca.pem;

# Diffie-Hellman parameter, recommended 4096 bits
ssl_dhparam /etc/nginx/ssl/dhparams.pem;

# Not using TLSv1 will break:
#	Android <= 4.4.40
#	IE <= 10
#	IE mobile <=10
# Removing TLSv1.1 breaks nothing else!
# TLSv1.3 is not supported by most clients, but it should be enabled.
ssl_protocols TLSv1.2 TLSv1.3;

# Prefer the SSL ciphers for ECDSA:
ssl_ciphers 'TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384';


# Use multiple curves.
ssl_ecdh_curve secp521r1:secp384r1;

# Server should determine the ciphers, not the client
ssl_prefer_server_ciphers on;

# OCSP Stapling
# fetch OCSP records from URL in ssl_certificate and cache them
ssl_stapling on;
ssl_stapling_verify on;

# This is the IP if yout DNS-Server (in most cases: your router's IP)
resolver 192.168.178.1;

# SSL session handling
ssl_session_timeout 24h;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;

Am Schluss muss der Webserver noch neu gestartet werden, damit die Änderungen greifen.

service nginx restart

Falls es hier zu Fehler kommen sollte, kann die genaue Stelle des Fehlers mit folgendem Befehl ermittelt werden:

nginx -t

Kontrolle der Änderungen

Nun kann man die Website im Browser aufrufen und sich die detaillierten Informationen zu der Seite anzeigen lassen. Unter Firefox geht dies beispielsweise, indem man auf das Schloss-Symbol in der Adressleiste klickt. Unter den Details zur Verbindung (Pfeil nach rechts) findet man unten die Schaltfläche Weitere Informationen. Hier sollte dann unter Technische Details ersichtlich werden, dass TLSv1.3 genutzt wird:

Firefox nutzt nun automatisch TLSv1.3
Firefox nutzt nun automatisch TLSv1.3

Eine weitere Anlaufstelle zum Testen von Websites und deren Sicherheit ist der SSL Server Test von Qualys. Beim Test der eigenen Website sollte hier ein A+ Rating und ein Hinweis auf die Unterstützung von TLSv1.3 angezeigt werden:

Beim Qualys SSL Server Test sollte man ein A+ Rating erzielen können
Beim Qualys SSL Server Test sollte man ein A+ Rating erzielen können

Hinweis: In der Kategorie Cipher Strength kann man hier momentan nur eine Wertung von 90% erzielen, auch wenn hier vorher (TLSv1.2) eine 100% Wertung aufgelistet wurde. Dies liegt darin begründet, dass der TLSv1.3-Standard eine Cipher Suite vorgibt, die nur auf 128 Bit basiert (TLS_AES_128_GCM_SHA256). Diese ist bei OpenSSL fest verdrahtet und kann nicht deaktiviert werden. Qualys wertet hier nur mit 100%, wenn alle Cipher Suites mindestens 256 Bit haben. Dies kann momentan nur umgangen werden, indem man OpenSSL selbst kompiliert und installiert. Auf einem Produktiv-System ist dies jedoch nicht zu empfehlen. Mehr Informationen zu diesem Problem findet man auf GitHub.

Wichtig beim SSL Server Tests ist aber ausschließlich das Rating von A+. Auch wenn eine Kategorie nicht mit 100% bewertet ist, stellt dies kein Sicherheits-Risiko dar.

Fazit

Mit dem Update von nginx auf v1.17.2 ist es nun auch endlich möglich, unter Ubuntu Server 18.04 LTS TLSv1.3 zu nutzen. Dies funktioniert ab sofort auch „out-of-the-box“, ohne dass man den Webserver oder OpenSSL selbst bauen und installieren muss.

TLSv1.3 bietet Vorteile bei der Sicherheit und Performance. Daher sollte man seinen Webserver auf jeden Fall für diesem modernen Standard konfigurieren.

Weiterführende Artikel

Links

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert