Allgemein
Zusammenfassung
HPKP (HTTP Public Key Pinning) ist ein Verfahren, wie ein Webserver dem Browser mitteilen kann, welches TLS Zertifikat in Zukunft verwendet werden muss. Bei einem künftigen Man in the Middle Angriff wird der Zugriff auf die Webseite unterbunden.
Funktionsweise (technische Details)
- Supportete Browser: Opera, Firefox, Chrome
- Nicht supportete Browser: IE11 Edge, Safari
- Ein nachträglich importiertes Root Zertifikat (z.B. für SSL Intercept von Blue Coat oder Zscaler) wird ebenfalls akzeptiert!
- Im FF kann dies gesteuert werden: security.cert_pinning_enforcement_level
- 0: Pinning ausgeschaltet
- 1: (default) Pinning, ausser eine nachträglich importierte CA ist im Spiel
- 2: strict, Pinning, auch bei importierten CAs
- Im Chrome kann man dies nicht steuern
- Unter chrome://net-internals/#hsts – HSTS und PKPK Informationen zu einer Domain abrufen (static_spki_hashes, dynamic_spki_hashes).
Load Module
a2enmod headers
# Optionally load the headers module: LoadModule headers_module modules/mod_headers.so
Hashing
Hashes
Let’s Encrypt Authority X3
YLh1dUR9y6Kja30RrAn7JKnbQG/uEtLMkBgFF2Fuihg=
DST Root CA X3
Vjs8r4z+80wjNcr1YKepWQboSIRi63WsWXhIMN+eWys<=
Calculate via OpenSSL
Eigene Cert:
openssl x509 -in /etc/apache2/ssl/apache.pem -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64
Let’s Encrypt cert:
openssl x509 -in /etc/apache2/ssl/<domain>/fullchain.pem -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64
GET via HTTP:
openssl s_client -servername domain.tld -connect
domain.tld:443 | openssl x509 -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64
Add Header to Apache
<VirtualHost *:443>
[...]
SSLCertificateFile /etc/apache/apache.cert
SSLCertificateChainFile /etc/apache/apache.pem
SSLCertificateKeyFile /etc/apache/apache.key
[...]
Header set Public-Key-Pins "pin-sha256=\"<HASH1>\"; pin-sha256=\"<HASH2>\"; max-age=2592000; includeSubDomains
[...]
</VirtualHost>