Christian/ Januar 23, 2019/ Betriebssysteme, IT-Security, Netzwerk

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>

Share this Post