SSL-Zertifikat erstellen
cd /etc/apache2 sudo mkdir ssl.key sudo mkdir ssl.crt sudo mkdir ssl.csr sudo openssl genrsa -out ssl.key/example.de.key 4096 sudo openssl req -new -sha256 -key ssl.key/example.de.key -out ssl.csr/example.de.csr
SSL-Konfiguration Apache
globale Konfiguration:
SSLProtocol all -SSLv2 -SSLv3 SSLHonorCipherOrder on SSLCompression off SSLOptions +StrictRequire SSLStrictSNIVHostCheck On # geaendert Mai 2016, manuell sortiert, erst PFS, dann RSA AES, dann 3DES für NIST compliance (ohne EDH ciphers für Apache 2.2) SSLCipherSuite ECDH+AES256:EDH+AES256:ECDH+AES128:EDH+AES128:RSA+AES:-AES+SHA:ECDH+AES:EDH-RSA-DES-CBC3-SHA:DES-CBC3-SHA:!aNULL:!eNULL:!LOW:!EXP:!RC4:!DES+SHA:!DES+MD5:!ADH:!AECDH:!MD5:!DSS
Konfiguration VirtualHost:
SSLEngine on SSLStrictSNIVHostCheck off SSLCertificateFile /etc/apache2/ssl.crt/example.de.crt SSLCertificateKeyFile /etc/apache2/ssl.key/example.de.key SSLCertificateChainFile /etc/apache2/ssl.crt/sub.class1.server.sha2.ca.pem SSLCACertificateFile /etc/apache2/ssl.crt/startssl.com.ca.cert.combined.pem
HTTP strikt transport security (HSTS)
In der Konfiguration des VirtualHost:
Header set Strict-Transport-Security "max-age=16070400; includeSubDomains"
OCSP Stapling
Funktioniert ab Apache 2.3.3.
In der Modul-Konfiguration (die ersten 4 Zeilen verschieben den Zertifikatstest auf den Client, wenn der OCSP Server nicht erreichbar ist):
SSLStaplingResponderTimeout 5 SSLStaplingReturnResponderErrors off SSLStaplingStandardCacheTimeout 86400 SSLStaplingErrorCacheTimeout 1200 SSLStaplingCache shmcb:/var/cache/apache2/mod_ssl/stapling_cache(128000)
Im VirtualHost (in dem SSL aktiv ist):
SSLUseStapling on
Testen (Wichtig: wenn ServerNameIndication nötig ist, muss die Option ‚-servername‘ gesetzt sein, da sonst das Zertifikat des ersten virtuellen Hosts getestet wird):
openssl s_client -connect www.example.com:443 -servername www.example.com -tls1 -tlsextdebug -status | grep -i "OCSP response"
Ist OCSP Stapling aktiv, sollte in der Ausgabe eine Zeile enthalten sein die wie folgt aussieht:
OCSP Response Status: successful (0x0)
Sollte OCSP Stapling nicht aktiv sein, enthält die Ausgabe folgende Zeile:
OCSP response: no response sent
HTTP public key pinning (HPKP)
Vorsicht: Mit HPKP kann man sich auch aus seiner Website aussperren. Wenn der Browser die Pins erst einmal gespeichert hat, sind diese nicht ohne weiteres zu löschen. Hab das „getestet“ 😉
Public key Informationen aus dem Zertifikat extrahieren mit:
openssl x509 -in my-certificate.crt -pubkey -noout | openssl rsa -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64
oder Public key Informationen aus dem Key-File extrahieren mit:
openssl rsa -in mykey.key -outform der -pubout | openssl dgst -sha256 -binary | openssl enc -base64
Innerhalb des VirtualHost folgendes einfügen (Apache, mod_headers muss aktiv sein):
Header always set Public-Key-Pins "pin-sha256=\"base64+primary==\"; pin-sha256=\"base64+backup==\"; max-age=5184000; includeSubDomains"