Nginx – Anpassung SSL Protokolle und Cipher Suites

Ich werde immer wieder gefragt, ob es zu dem Beitrag Apache – Anpassung SSL Protokolle und Cipher Suites auch eine Referenz für Nginx gibt? Der einzigste Beitrag, der das kurz und bündig beschreibt ist aus dem Jahr 2015. Und auf Grund des Alters natürlich schon ein wenig eingestaubt. Daher habe ich mich entschlossen diesen zu überarbeiten.

Als Betriebssystem setze ich Ubuntu 18.04.4 LTS ein. In den Repositories von Canonical wird aktuell Nginx in Version 1.14.0 installiert.

root@ubuntu-2gb-nbg1-1:~# nginx -v
nginx version: nginx/1.14.0 (Ubuntu)

Das bedeutet, dass das SSL Protokoll TLS 1.3 zur Verfügung steht.

Im Gegensatz zu Apache gibt es keine zentrale, vorgefertige Konfiguration. Das liegt daran, dass beim Nginx die Konfiguration in der jeweiligen Konfiguration einer ‚Site‘ vorgenommen wird. Ich habe für diesen Beitrag eine neue vollständige, neue Konfiguration auf Basis der Datei /etc/nginx/sites-enabled/default erstellt.

Um das untenstehende Ergebnis bei Qualys zu erreichen, muss das verwendete SSL-Zertifikat eine Schlüssel (Key) von 4096 Bit haben. Denn standardmäßig (out of the box) wird nach wie vor 2048 Bit verwendet. Das bewirkt beim SSL Test in der Kategorie „Key Exchange“ 90 anstatt 100 Punkte.

Die ‚Site‘ hört auf den Namen nginx.test.wydler.eu und die Konfigurationsdatei heißt nginx.test.wydler.eu.conf. Die Datei ist wie folgt aufgebaut:

        listen 80;
        listen [::]:80;
        server_name nginx.test.wydler.eu;
        return 301 https://$server_name$request_uri;
}
server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name nginx.test.wydler.eu;

        root /var/www/html;
        index index.html index.htm index.nginx-debian.html;
        ssl_certificate /etc/letsencrypt/live/nginx.test.wydler.eu/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/nginx.test.wydler.eu/privkey.pem;

        ssl_ciphers "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-CCM8:DHE-RSA-AES256-CCM:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA";
        ssl_prefer_server_ciphers on;

        ssl_ecdh_curve secp521r1:secp384r1:prime256v1;

        resolver_timeout 5s;
        ssl_stapling on;
        ssl_stapling_verify on;

        ssl_session_cache shared:le_nginx_SSL:1m;
        #ssl_session_cache shared:SSL:50m;
        ssl_session_timeout 5m;
        ssl_buffer_size 1400;
        ssl_session_tickets off;

        add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";

        location / {
                try_files $uri $uri/ =404;
        }

}

 

DH-Keys erzeugen:

openssl dhparam -out /etc/ssl/dhparams4096.pem 4096

Dieser Vorgang kann je nach System einige Minuten in Anspruch nehmen. Zeit für einen Tee oder Kaffee. 🙂

Abschließend muss die angepasste Konfiguration eingelesen werden:

service nginx configtest
service nginx restart

Das Ergebnis bei Qualys SSL Server Test kann sich sehen lassen:

Die SSL Protokolle und Cipher Suites müssen natürlich mit der Zeit gepasst werden.