Webserver SSL Optimierung: HSTS und HPKP

Ich möchte euch hier erklären wie ihr eure Apache, NGINX und Lighttpd Webserver einer SSL Härtung unterziehen könnt. In den folgenden Schritten aktivieren wir HSTS und HPKP in den einzelnen Konfigurationen.

Kurz erklärt:

  • HSTS oder auch „HTTP Strict Transport Security“ soll die Verbindung vor einer Downgrade-Attacke schützen, mehr dazu könnt ihr hier nachlesen.
  • HPKP oder auch „HTTP Public Key Pinning“ soll vor Man-in-the-Middle-Angriffen schützen, mehr dazu ist hier nachzulesen.

Punkt 1: Apache Webserver

Wichtig: Für die folgenden Schritte wird das Apache Modul headers_module benötigt.

a2enmod headers

HSTS aktivieren:

Füge diesen Code in deine vHost-Config im Abschnitt <VirtualHost> ein.

Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"

Starte den Dienst neu.

service apache2 restart
- oder -
systemctl restart apache2

Das Rating der SSL Labs Webseite sollte sich mit dieser Zeile Code von einem A Rating auf ein A+ Rating verbessern und es sollte Strict Transport Security (HSTS) :  YES zurückgegeben werden.

HPKP aktivieren:

Zuerst berechnen wir die sha256 Prüfsumme für den Public Key aus unserem signierten Zertifikat.

openssl x509 -in /etc/ssl/private/domain.de.crt -pubkey -noout | openssl rsa -pubin -outform der | openssl dgst -sha256 -binary | base64
writing RSA key
XfxzyyFOKjrOqiX61Arc5LqySM+oaYxHtDBUcThOk9I=

Weiter benötigen wir einen Backup Public Key. Damit wir kein neues Zertifikat erstellen wollen, nehmen wir das CSR File und erstellen unseren sha256 Hash. Zur not kann aus dem CSR ein neues Zertifikat angefordert werden. Darum bietet sich diese Methode an.

openssl x509 -in /etc/ssl/private/domain.de.csr -pubkey -noout | openssl rsa -pubin -outform der | openssl dgst -sha256 -binary | base64
unable to load certificate
140444301194920:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:703:Expecting: TRUSTED CERTIFICATE
unable to load Public Key
140356596324008:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:703:Expecting: PUBLIC KEY
47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=

Die Fehlermeldungen sollen uns nicht weiter stören, wichtig ist wieder die letzte Zeile.

Jetzt pflegen wir beide Public Keys in die vHost-Config im Abschnitt <VirtualHost> ein. Zuerst den Haupt-Key, dann den Backup-Key.

Header always set Public-Key-Pins "pin-sha256=\"XfxzyyFOKjrOqiX61Arc5LqySM+oaYxHtDBUcThOk9I=\"; pin-sha256=\"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=\"; max-age=5184000; includeSubDomains"

Starte den Dienst neu.

service apache2 restart
- oder -
systemctl restart apache2

Prüfe auf der SSL Labs Webseite ob Public Key Pinning (HPKP) : YES zurückgegeben wird.

CipherSuite anpassen:

In den SSL Einstellung /etc/apache2/mods-enabled/ssl.conf setzen wir noch folgende Ciphers.

SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
# taken from https://bettercrypto.org
SSLCipherSuite 'EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:\
EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:\
+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:\
!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA'
# Requires Apache >= 2.4
SSLCompression off 
SSLSessionTickets Off
SSLUseStapling on 
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"

Starte den Dienst neu.

service apache2 restart
- oder -
systemctl restart apache2

Prüfe auf der SSL Labs Webseite ob sich die Cipher Strength erhöht hat.

Punkt 2: NGINX Webserver

HSTS aktivieren:

Füge diesen Code in deine vHost-Config im Abschnitt server { ein.

server {
listen 443 ssl;
server_name domain.de;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";

Starte den Dienst neu.

service nginx restart
- oder -
systemctl restart nginx

Das Rating der SSL Labs Webseite sollte sich mit dieser Zeile Code von einem A Rating auf ein A+ Rating verbessern und es sollte Strict Transport Security (HSTS) :  YES zurückgegeben werden.

HPKP aktivieren:

Zuerst berechnen wir die sha256 Prüfsumme für den Public Key aus unserem signierten Zertifikat.

openssl x509 -in /etc/ssl/private/domain.de.crt -pubkey -noout | openssl rsa -pubin -outform der | openssl dgst -sha256 -binary | base64
writing RSA key
XfxzyyFOKjrOqiX61Arc5LqySM+oaYxHtDBUcThOk9I=

Weiter benötigen wir einen Backup Public Key. Damit wir kein neues Zertifikat erstellen wollen, nehmen wir das CSR File und erstellen unseren sha256 Hash. Zur not kann aus dem CSR ein neues Zertifikat angefordert werden. Darum bietet sich diese Methode an.

openssl x509 -in /etc/ssl/private/domain.de.csr -pubkey -noout | openssl rsa -pubin -outform der | openssl dgst -sha256 -binary | base64
unable to load certificate
140444301194920:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:703:Expecting: TRUSTED CERTIFICATE
unable to load Public Key
140356596324008:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:703:Expecting: PUBLIC KEY
47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=

Die Fehlermeldungen sollen uns nicht weiter stören, wichtig ist wieder die letzte Zeile.

Jetzt pflegen wir beide Public Keys in die vHost-Config im Abschnitt server { ein. Zuerst den Haupt-Key, dann den Backup-Key.

add_header Public-Key-Pins 'pin-sha256="XfxzyyFOKjrOqiX61Arc5LqySM+oaYxHtDBUcThOk9I="; pin-sha256="47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU="; max-age=5184000; includeSubDomains';

Starte den Dienst neu.

service nginx restart
- oder -
systemctl restart nginx

Prüfe auf der SSL Labs Webseite ob Public Key Pinning (HPKP) : YES zurückgegeben wird.

CipherSuite anpassen:

In den SSL Einstellung /etc/nginx/sites-enabled/domain.de.conf setzen wir noch folgende Ciphers.

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA";
ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off; # Requires nginx >= 1.5.9
ssl_stapling on; # Requires nginx >= 1.3.7
ssl_stapling_verify on; # Requires nginx => 1.3.7
resolver $DNS-IP-1 $DNS-IP-2 valid=300s;
resolver_timeout 5s;

Starte den Dienst neu.

service nginx restart
- oder -
systemctl restart nginx

Prüfe auf der SSL Labs Webseite ob sich die Cipher Strength erhöht hat.

Punkt 3: Lighttpd Webserver

HSTS aktivieren:

Füge diesen Code in deine Config /etc/lighttpd/lighttpd.conf ein. Achtet darauf, dass mod_setenv noch vor mod_redirect geladen wird.

server.modules = (
        [..]
        "mod_setenv",
        "mod_redirect",
        [..]
)

$HTTP["scheme"] == "https" {
    setenv.add-response-header  = ( "Strict-Transport-Security" => "max-age=63072000; includeSubdomains")
}

Starte den Dienst neu.

service lighttpd restart
- oder -
systemctl restart lighttpd

Das Rating der SSL Labs Webseite sollte sich mit dieser Zeile Code von einem A Rating auf ein A+ Rating verbessern und es sollte Strict Transport Security (HSTS) :  YES zurückgegeben werden.

HPKP aktivieren:

Zuerst berechnen wir die sha256 Prüfsumme für den Public Key aus unserem signierten Zertifikat.

openssl x509 -in /etc/ssl/private/domain.de.crt -pubkey -noout | openssl rsa -pubin -outform der | openssl dgst -sha256 -binary | base64
writing RSA key
XfxzyyFOKjrOqiX61Arc5LqySM+oaYxHtDBUcThOk9I=

Weiter benötigen wir einen Backup Public Key. Damit wir kein neues Zertifikat erstellen wollen, nehmen wir das CSR File und erstellen unseren sha256 Hash. Zur not kann aus dem CSR ein neues Zertifikat angefordert werden. Darum bietet sich diese Methode an.

openssl x509 -in /etc/ssl/private/domain.de.csr -pubkey -noout | openssl rsa -pubin -outform der | openssl dgst -sha256 -binary | base64
unable to load certificate
140444301194920:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:703:Expecting: TRUSTED CERTIFICATE
unable to load Public Key
140356596324008:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:703:Expecting: PUBLIC KEY
47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=

Die Fehlermeldungen sollen uns nicht weiter stören, wichtig ist wieder die letzte Zeile.

Jetzt pflegen wir beide Public Keys in die Config /etc/lighttpd/lighttpd.conf ein. Zuerst den Haupt-Key, dann den Backup-Key.

server.modules = (
        [..]
        "mod_setenv",
        "mod_redirect",
        [..]
)

$HTTP["scheme"] == "https" {
    setenv.add-response-header  = ( "Public-Key-Pins" => "pin-sha256=\"XfxzyyFOKjrOqiX61Arc5LqySM+oaYxHtDBUcThOk9I=\"; pin-sha256=\"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=\"; max-age=5184000; includeSubDomains")
}

Starte den Dienst neu.

service lighttpd restart
- oder -
systemctl restart lighttpd

Prüfe auf der SSL Labs Webseite ob Public Key Pinning (HPKP) : YES zurückgegeben wird.

CipherSuite anpassen:

In den SSL Einstellung /etc/lighttpd/lighttpd.conf setzen wir noch folgende Ciphers.

ssl.honor-cipher-order = "enable"
ssl.cipher-list = "EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA"
ssl.use-compression = "disable"
ssl.use-sslv2 = "disable"
ssl.use-sslv3 = "disable"

Starte den Dienst neu.

service lighttpd restart
- oder -
systemctl restart lighttpd

Prüfe auf der SSL Labs Webseite ob sich die Cipher Strength erhöht hat.

 

Dominion

Dominion

Linux Systemadministrator

Das könnte Dich auch interessieren …

Schreibe einen Kommentar

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