OpenSSL a OCSP

OCSP, neboli Online Certificate Status Protocol, je alternativou k CRL pro ověření platnosti certifikátu. V OpenSSL je pro OCSP také podpora. Jak to tedy funguje a jak to rozchodit?

Pro ověření slouží tzv. OCSP Responder. Ten si někde běží a poslouchá. Klient, který obdrží nějaký certifikát a chce ho ověřit, se na něj responderu zeptá a ten mu odpoví, že je buď OK, neplatný anebo že neví. Responder je vybaven také vlastním certifikátem, takže veškeré odpovědi podepisuje a klient tedy má jistotu, že se baví opravdu s daným responderem. Aby se zaručilo to, že klient se opravdu baví se správným našim responderem a ne jen s někým, kdo má od naší CA certifikát, přidává se do certifikátu pro responder ještě rozšíření, které říká, že toto je responder. Dále je potřeba, aby klient věděl, kde se má na platnost ptát. Proto další rozšíření říkající, kde je OCSP Responder pro tuhle autoritu, se dá nacpat buď do CA certifikátu nebo do jednotlivých vydaných certifikátů. OCSP responder ke svému životu kromě jeho certifikátu ještě potřebuje indexový soubor, který si OpenSSL u CA vytváří a nalézají se v něm informace o všech vydaných certifikátech (sériové číslo a to, zda je platný).

Konfigurace CA pro OpenSSL lze najít třeba zde. Do konfiguračního souboru je pak třeba jen doplnit dvě sekce pro rošíření, které použijeme. Výsledek pak bude vypadat takto:

[ ca ]
default_ca      = CA_default
[ CA_default ]
dir            = /home/user/ca
database       = $dir/index.txt
new_certs_dir  = $dir/newcerts
certificate    = $dir/CAcert.pem
serial         = $dir/serial
private_key    = $dir/CAkey.pem
RANDFILE       = $dir/.rand
default_days   = 3650
default_crl_days= 30
default_md     = md5
policy         = policy_any
email_in_dn    = no
name_opt       = ca_default
cert_opt       = ca_default
copy_extensions = none
[ policy_any ]
countryName            = supplied
stateOrProvinceName    = optional
organizationName       = optional
organizationalUnitName = optional
commonName             = supplied
emailAddress           = optional
[ ocsp_cert ]
extendedKeyUsage = OCSP Signing
[ ocsp_ca ]
authorityInfoAccess = 1.3.6.1.5.5.7.48.1;URI:http://ocsp.mojeca.com:8888
URI ocsp.mojeca.com by měla ukazovat na server, kde potom běží OCSP responder, 8888 je port, na kterém naslouchá. Pro vytvoření CA certifikátu si napřed uděláme CSR a ten pak podepíšeme sebou samým. Při podepsání ale doplníme rozšíření:
openssl ca -config openssl.cnf -in CAcert.csr -out CAcert.pem -extensions ocsp_ca
Tím jsme si vytvořili CA, která má ve svém certifikátu uvedenou URI adresu OCSP serveru pro kontrolu. Nyní ještě potřebujeme vytvořit certifikát pro samotný responder. To uděláme obdobně, jen za -extensions doplníme ocsp_cert místo ocsp_ca - tím dáme na vědomí, že tento certifikát patří skutečně responderu.

Nyní si již responder můžeme pustit. To provedeme tímto:

openssl ocsp -index index.txt -port 8888 -rsigner ocsp.pem -rkey ocsp.key -CA CAcert.pem -text
ocsp.pem je certifikát pro responder, ocsp.key je privátní klíč k němu a CAcert.pem je certifikát naší autority. index.txt je zase indexový soubor, který si openssl vytváří a jsou v něm informace o všech vydaných certifikátech. Proces openssl po tomto zadání zůstane spuštěný a naslouchá na daném portu. Pokud změníme databázi certifikátů (vytvoříme nový nebo nějaký naopak zneplatníme) - a změní se index.txt, je potřeba responder restartnout (resp. vypnout a znovu zapnout) - jinak si pamatuje stále poslední databázi a nevidí změny.

Pro zkoušku se můžeme sami našeho responderu zeptat, co si myslí o nějakém certifikátu. Mějme certifikát cert.pem, potom jeho stav zjistíme takto:

openssl ocsp -issuer CAcert.pem -CAfile CAcert.pem -cert torevoke.pem -url http://ocsp.mojeca.com:8888 -resp_text
Klíčové pro nás budou dva řádky u konce výpisu, jeden se statusem certifikátu, zda je teda platný, neznámý nebo zneplatněný a druhý, který říká, jestli odpověď, kterou jsme dostali, opravdu patří správnému responderu a neposílá nám ji jen tak někdo.