OCSP Heften, besser bekannt unter „OCSP stapling“, bietet dem Client die Möglichkeit, die Gültigkeit eines Zertifikats abzufragen, wodurch die Sicherheit gesteigert wird. Es gibt viele Anleitungen bezüglich der Einrichtung, leider habe ich noch keine vollständige gefunden. Oftmals wird ein Teil weggelassen, der für manche vielleicht selbstverständlich ist – für andere jedoch nicht. Aus diesem Grunde möchte ich hier nun eine möglichst vollständige Anleitung präsentieren, wie man selbst OCSP stapling korrekt einrichten kann.
Dabei gehe ich davon aus, dass SSL bereits auf dem Server konfiguriert ist, beispielsweise folgendermaßen innerhalb des server
-Blocks:
server {
listen 443 ssl spdy;
[…]
ssl_certificate /etc/ssl/ssl-bundle.crt;
ssl_certificate_key /etc/ssl/ssl.key;
ssl_dhparam /etc/ssl/dhparam-ssl.pem;
add_header Strict-Transport-Security "max-age=31536000;";
}
Code-Sprache: JavaScript (javascript)
Für OCSP stapling gibt es in nginx eine recht einfache Methode, selbiges in der Konfiguration hinzuzufügen. Zuerst einmal benötigt man jedoch einen „resolver“, der den Domainnamen zur IP-Adresse auflösen kann:
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 10s;
In diesem Fall sind die DNS-Server von Google eingetragen. Je nach Vorliebe können natürlich auch andere genutzt werden.
OCSP stapling lässt sich dann folgendermaßen aktivieren:
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/ssl/full-chain.pem;
Mit ssl_stapling on;
wird OCSP stapling erst einmal generell aktiviert.
Mit ssl_stapling_verify on;
aktiviert man die serverseitige Prüfung bei der Anfrage der OCSP-Zertifizierung. Das heißt, dass die Herkunft der Anfrage geprüft wird, die das Zertifikat bzw. dessen Status über OCSP als gültig oder ungültig einstuft.
Mit ssl_trusted_certificate /etc/ssl/full-chain.pem;
gibt man eine Reihe von Zertifikaten an, welche für die Zertifizierung notwendig sind. Diese sind in folgender Reihenfolge zu setzen:
- Server-Zertifikat
- Intermediate-Zertifikat(e)
- Root-Zertifikat
Diese erstellt man beispielsweise mit folgendem Befehl:cat ssl.crt intermediate.crt root.crt > full-chain.pem
Nun noch nginx neu starten und schon sollte man OCSP stapling nutzen können.sudo service nginx restart
Prüfung
Nach dem Konfigurieren macht es natürlich Sinn, auch zu prüfen, ob OCSP stapling aktiviert ist. Dies geht mit folgendem Befehl:openssl s_client -connect <domain>:443 -tls1 -tlsextdebug -status
Für <domain>
muss man natürlich die eigene Domain angeben, für die man das Zertifikat und OCSP stapling eingerichtet hat.
Dort findet sich dann, sofern erfolgreich, ein Abschnitt, der folgendermaßen aussieht:
OCSP Response Data:
OCSP Response Status: successful (0x0)
Response Type: Basic OCSP Response
Version: 1 (0x0)
Responder Id: 9F10D9EDA5260B71A677124526751E17DC85A62F
Produced At: Aug 13 05:45:37 2015 GMT
Responses:
Certificate ID:
Hash Algorithm: sha1
Issuer Name Hash: 84D56BF8098BD307B766D8E1EBAD6596AA6B6761
Issuer Key Hash: F5CDD53C0850F96A4F3AB797DA5683E669D268F7
Serial Number: 11214031FBEF86DFEECED34F23DC589BC84E
Cert Status: good
This Update: Aug 13 05:45:37 2015 GMT
Next Update: Aug 13 17:45:37 2015 GMT
Code-Sprache: CSS (css)
Problembehebung
Verify return code: 20 (unable to get local issuer certificate)
Sollte der oben genannte Fehlercode bei der Prüfung erscheinen, so ist das erst einmal kein direkter Hinweis auf ein Zertifikatsfehler. Viel mehr findet der Befehl openssl
auf dem lokalen System keinen Pfad zu den dort hinterlegten (Root-)Zertifikaten. Dieses muss manuell angegeben werden. Unter Debian/Ubuntu sind sie beispielsweise unter /etc/ssl/certs/
zu finden.
Im Befehl selbst kann man sie folgendermaßen angeben: -CApath /etc/ssl/certs/
Der Befehl sieht dann komplett wie folgt aus: openssl s_client -CApath /etc/ssl/certs/ -connect <domain>:443 -tls1 -tlsextdebug -status
OCSP response: no response sent
Erscheint diese Meldung statt einer „successful“ bei den OCSP-Daten, so ist nicht zwingend etwas falsch. Nach dem Neustart von nginx kann es 5–10 Minuten dauern, bis er eine gültige OCSP-Antwort gespeichert hat. Daher einfach mal ein paar Minuten warten.
Besteht der Fehler weiterhin, ist die oben angelegte full-chain.pem
zu prüfen, ob die Zertifikate wirklich in der korrekten Reihenfolge hinterlegt sind.
Manuelle Methode
Es ist auch möglich, manuell über ssl_stapling_file
direkt eine Datei anzugeben, in welcher die Antwort einer OCSP-Anfrage abgespeichert ist. Diese hat jedoch den entscheidenden Nachteil, dass man die Aktualisierung extern manuell vornehmen muss. In der erklärten Variante von oben dagegen überlässt man das dem nginx-Server, der selbst am besten weiß, wann er eine Aktualisierung vorzunehmen hat.