OCSP-Stapling in nginx

OCSP-Stapling kann in nginx ab Version 1.3.7 leicht angeschaltet werden. Die Basiskonfiguration ist simpel, allerdings gilt es vier Fallen zu umgehen:

Netzwerk

Der Webserver, auf dem OCSP-Stapling konfiguriert werden soll, muss ausgehende Anfragen an http://ocsp.pca.dfn.de stellen können. Sollte der Server durch eine Firewall an ausgehendem Traffic gehindert werden, muss für OCSP-Stapling eine Ausnahme gemacht werden.

Ist dies nicht erwünscht, müssen komplexere Setups genutzt werden, bei denen OCSP-Responses als Datei über mehrere  Etappen bis zum Webserver gelangen. Auf diese Szenarien wird hier aber nicht weiter eingegangen.

DNS

nginx nutzt per Default den DNS Server von Google, IP 8.8.8.8, um die Adresse des OCSP-Responders  (in der DFN-PKI ist dies ocsp.pca.dfn.de) aufzulösen. Die meisten Webserver sind sinnvollerweise so konfiguriert, dass sie keine Verbindung zu externen DNS-Servern aufnehmen können. Daher muss dem nginx die Adresse des lokalen DNS-Servers separat über den Konfigurationseintrag resolver mitgeteilt werden.

Zertifikatsketten

nginx benötigt die vollständige Zertifikatkette des Serverzertifikats inklusive der Wurzel zum Betrieb von OCSP Stapling. Der dafür vorgesehene Konfigurationsparameter ist ssl_trusted_certificate.

Dieser Parameter ist ein wenig problematisch, da die dort enthaltene Zertifikatkette auch im Rahmen des TLS-Handshakes an Endgeräte ausgeliefert wird, wenn in ssl_certificate keine Kette enthalten ist. Im TLS-Handshake soll das Wurzelzertifikat aber nicht mit enthalten sein.

Die Lösung: In ssl_trusted_certificates die vollständige Kette inklusive Wurzelzertifiakt konfigurieren, und in das Serverzertifikat in ssl_certificate die Kette ohne Wurzelzertifikat aufnehmen. Die Reihenfolge der Zertifikate in den Dateien muss „aufsteigend“ bis zur Wurzel sein. Es müssen die reinen PEM-Files ohne Zwischen-Kommentare angegeben werden:
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----

Mehrere virtuelle Hosts

Wenn mehrere virtuelle Hosts im nginx konfiguriert sind, so muss OCSP-Stapling mindestens für den als default_server konfigurierten Host aktiviert sein, damit das OCSP-Stapling dann auch auf den anderen virtuellen Hosts funktionieren kann.

Konfiguration

Konkret sollte der vom OCSP-Stapling betroffene Teil der SSL-Konfiguration eines nginx also folgendermaßen aussehen (die IP-Adressen sind natürlich, wie die Pfade, nur Platzhalter):

ssl_trusted_certificate /pfad/vollstaendige_kette_mit_root
ssl_certificate /pfad/serverzertifikat_inklusive_kette_ohne_root
ssl_stapling on;
ssl_stapling_verify on;
resolver 192.168.100.100 192.168.100.101 valid=300s;
resolver_timeout 10s

Testen

Getestet wird die OCSP-Stapling-Konfiguration auf dem nginx mittels (der Host-Name ist natürlich auch hier nur ein Platzhalter) :

openssl s_client -connect blog.example.org:443 -servername blog.example.org -status < /dev/null 2>&1 | grep -i "OCSP response"

Nach einem Neustart des nginx wird die einzubettende OCSP-Response erst beim ersten Abruf einer Web-Seite des Servers vom OCSP-Responder abgeholt und zwischengespeichert, so dass bei diesem ersten Abruf keine OCSP-Response eingebettet werden kann. Erst beim zweiten Abruf einer Web-Seite des Servers wird dann auch eine eingebettete OCSP-Response mitgeliefert, d.h. nach einem Neustart des nginx muss obiger openssl-Aufruf zweimal hintereinander ausgeführt werden, um ein aussagekräftiges Ergebnis zu liefern.

Dokumentation von nginx:  http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_stapling

(jbr, 17.06.2015, ergänzt am 20.11.2015)