DNSSEC, TLSA, DANE, HTTPS, SSL

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"