NGINX – sichere SSL/TLS Konfiguration mit Perfect Forward Secrecy (PFS) und A+ Wertung von Qualys SSL Labs

nginx-a+-ssllabs
Qualys SSL Labs A+ Bewertung

In diesem Artikel wird die Konfiguration von SSL/TLS von NGINX beschreiben. Voraussetzung ist eine lauffähige aktuelle NGINX-Installation. Eine Anleitung wie das unter CentOS 7 funktioniert findet man in dem Artikel CentOS 7 – NGINX aus dem NGINX-Repository installieren.

Weiterhin benötigten wir ein gültiges Zertifikat, dazu gehören der Key, das Zertifikat und eventuell ein CA-Bundle.

Konfiguration NGNIX mit SSL/TLS

Dazu erweitern wit unsere Konfiguration um einen weiteren vHost der auf Port 443 lauscht. Für diesen aktivieren wir ssl und optional spdy.

Weitere Infos zu spdy findet man auf der Projektseite von spdy. Es spricht eigentlich nichts dagegen sdpy zu verwenden. In wie weit sich dies in irgend einer Form auf das Ranking der Webseite auswirkt kann ich nicht sagen.

server {
    listen 443 ssl spdy;
    listen [::]:443 ssl spdy;
    server_name domain.tld;
    index index.php index.html index.htm;

    ssl    on;
    ssl_certificate     /etc/ssl/domain.tld/domain.tld.pem;
    ssl_certificate_key /etc/ssl/domain.tld/domain.tld.key;

}

Die Pfade zu den Parametern ssl_certificate und ssl_certificate_key müssen natürlich passen.

NGINX CA-Chain einrichten

Falls noch ein CA_Bundle vorliegt muss dies noch in die Datei vom ssl_certificate eingefügt werden. Den Parameter SSLCACertificateFile wie bei Apaches httpd gibt es unter NGINX nicht.

cat domain.tld.crt CA-Chain_bundle.pem > domain.tld.pem

Die Datei domain.tld.pem beinhaltet also das eigentliche Zertifikat und das Zertifikat-Bundle der CA.

Nach dem Neustart von NGINX ist SSL/TLS lauffähig.

NGINX und Perfect Forward Secrecy (PFS) aktivieren

Wie Perfect Forward Secrecy genau funktioniert werde ich an dieser Stelle nicht weiter erläutern. Dazu gibt es viele detaillierte Artikel im Internet. Eine kurze Erklärung gibt es auf der Wikipedia-Seite.

Zuerst benötigen wir eine Datei mit dem Diffie-Hellman Key. Diese erzeugt man wie folgt:

openssl dhparam -out /etc/nginx/dh_4096.pem 4096

Das kann je nach Leistung des Systems ein paar Minuten dauern.

Anschliessend erstellen wir eine Datei in dieser wir alle Konfigurations-Parameter für Perfect Forward Secrecy und noch ein paar zusätzliche add_header-Anweisungen einfügen.

vi /etc/nginx/perfect-forward-secrecy.conf

In diese Datei fügen wir dann folgende Zeilen ein.

add_header Strict-Transport-Security "max-age=31536000";
add_header X-Frame-Options SAMEORIGIN;

ssl_session_cache    shared:SSL:10m;
ssl_session_timeout  10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

ssl_stapling on;
ssl_dhparam dh_4096.pem;

ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS +RC4 RC4";

Die zusätzlichen Header aktivieren HTTP Strict Transport Security (HSTS) und verhindern Clickjacking.

Diese Datei müssen wir nun noch in unsere NGINX-Konfiguration einbinden. In diesen Fall entscheide ich mich für das globale Einbinden der Datei. So sind diese Einstellung für alle meine vHost aktiv die SSL/TLS verwenden.

Dazu editieren wir die Datei /etc/nginx/nginx.conf.

vi /etc/nginx/nginx.conf

Im untern Bereich fügen wir dann das include der Datei Perfect-Forward-Secrecy-Datei ein.

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    ...

    include perfect-forward-secrecy.conf;
}

Nach einen Neustart von NGINX sollte nun FPS aktiv sein.

Nun kann man unter https://www.ssllabs.com/ssltest/ seine Einstellungen testen. Man sollten diesen Test in regelmäßigen Abständen durchführen. Es kann sein, dass einige Cipher als unsicher deklariert werden. Diese müssen dann aus der Konfiguration entfernt werden.

Es loht wie immer ein Blick in die Dokumentation von NGINX. Dort werden die Parameter nochmals genauer erklärt.

Ein Kommentar

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.