Nginx - Public Key Pinning configureren

Let op: Google stopt vanaf eind maart 2018 met het ondersteunen van Public Key Pinning, in plaats hiervan kun je gebruik maken van CAA records.

HTTP Public Key Pinning (HPKP) vereist dat er een extra header meegezonden wordt naar de browser, waarin de hash van de public key van het certificaat is opgenomen. Daarnaast wordt er ook een hash van een nog niet bekende public key meegestuurd, zodat er bij een gecompromitteerd certificaat altijd nog een nieuwe kan worden aangevraagd.

HTTP Public Key Pinning (HPKP) vereist dat er een extra header meegezonden wordt naar de browser, waarin de hash van de public key van het certificaat is opgenomen. Daarnaast wordt er ook een hash van een nog niet bekende public key meegestuurd, zodat er bij een gecompromitteerd certificaat altijd nog een nieuwe kan worden aangevraagd.

Aanmaken backup Private Key

Via onderstaande opdracht wordt er een tweede CSR en Private Key aangemaakt, waarmee er indien nodig een nieuw certificaat aangevraagd kan worden. Let er op dat de gegevens gelijk zijn aan de gegevens van het actieve certificaat voor tenminste de Common Name en de bedrijfsnaam.

openssl req -out backup.csr -pubkey -new -keyout backup.key

Aanmaken hash van actieve public key

Met de onderstaande opdracht wordt er een SHA-256 hash gemaakt van de Public Key uit het actieve CSR van het certificaat.

openssl req -inform pem -pubkey -noout < actieve.csr \
| openssl pkey -pubin -outform der \
| openssl dgst -sha256 -binary \
| base64

Aanmaken hash van backup public key

Met de onderstaande opdracht wordt er een SHA-256 hash gemaakt van de Public Key uit het backup CSR voor een eventueel nieuw certificaat.

openssl req -inform pem -pubkey -noout < backup.csr \
| openssl pkey -pubin -outform der \
| openssl dgst -sha256 -binary \
| base64

Configureren HPKP headers per website

Stel per header de website in, het configuratie bestand staat bij een standaard configuratie in de directory /etc/nginx/sites-enabled/.

Om op deze website de header voor HTTP Public Key Pinning in te stellen, moet onderstaande regel aan de HTTPS vhost configuratie worden toegevoegd:

server {
listen 443 ssl;
...
add_header Public-Key-Pins "max-age=60;pin-sha256='GRAH5Ex+kB4cCQi5gMU82urf+6kEgbVtzfCSkw55AGk=';pin-sha256='Dh46PQn5HIpXCusEb8G7YJsLzBSGAzNjgvsxeShjlv8='"
...
}

De toevoeging van de includeSubDomains optie zorgt er voor dat de browser nu voor alle subdomeinen van de website ook de HPKP header meestuurt. Het is aan te raden te beginnen met een kleine max-age van bijvoorbeeld 60 seconden, zodat bij een fout in de configuratie de website voor lange periode niet meer te bezoeken is. Wanneer de configuratie in orde is, kan de max-age worden verhoogd naar b.v. 15768000. Daarnaast is bij het gebruik van een wildcard certificaat het opnemen van de optie includeSubDomains achteraan de regel nodig.

Na het opnieuw laden van de Nginx configuratie wordt voor elke bezoeker de header ingesteld. Let op dat deze configuratieregel alleen in de HTTPS (:443) website configuratie kan worden opgenomen en niet in de HTTP (:80) versie.

point up