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.
1 | a2enmod headers |
HSTS aktivieren:
Füge diesen Code in deine vHost-Config im Abschnitt <VirtualHost>
ein.
1 | Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains" |
Starte den Dienst neu.
1 2 3 | 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.
1 2 3 | 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.
1 2 3 4 5 6 | 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.
1 | Header always set Public-Key-Pins "pin-sha256=\"XfxzyyFOKjrOqiX61Arc5LqySM+oaYxHtDBUcThOk9I=\"; pin-sha256=\"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=\"; max-age=5184000; includeSubDomains" |
Starte den Dienst neu.
1 2 3 | 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.
1 2 3 4 5 6 7 8 9 10 11 12 | 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.
1 2 3 | 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.
1 2 3 4 | server { listen 443 ssl; server_name domain.de; add_header Strict-Transport-Security "max-age=63072000; includeSubdomains"; |
Starte den Dienst neu.
1 2 3 | 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.
1 2 3 | 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.
1 2 3 4 5 6 | 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.
1 | add_header Public-Key-Pins 'pin-sha256="XfxzyyFOKjrOqiX61Arc5LqySM+oaYxHtDBUcThOk9I="; pin-sha256="47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU="; max-age=5184000; includeSubDomains'; |
Starte den Dienst neu.
1 2 3 | 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.
1 2 3 4 5 6 7 8 9 10 | 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.
1 2 3 | 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.
1 2 3 4 5 6 7 8 9 10 | server.modules = ( [..] "mod_setenv", "mod_redirect", [..] ) $HTTP["scheme"] == "https" { setenv.add-response-header = ( "Strict-Transport-Security" => "max-age=63072000; includeSubdomains") } |
Starte den Dienst neu.
1 2 3 | 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.
1 2 3 | 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.
1 2 3 4 5 6 | 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.
1 2 3 4 5 6 7 8 9 10 | 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.
1 2 3 | 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.
1 2 3 4 5 | 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.
1 2 3 | service lighttpd restart - oder - systemctl restart lighttpd |
Prüfe auf der SSL Labs Webseite ob sich die Cipher Strength
erhöht hat.
0