Prohlížeče se o zneplatnění (revokaci) certifikátu převážně nedozví a tak byste to možná chtěli zkusit ověřit ručně. Existuje několik možností, jak se zeptat Online Certificate Status Protocol (OCSP) serveru, tak si pojďme některé ukázat. Budete potřebovat browser (a nástroj openssl
).
Pokud chcete zkontrolovat certifikát, který je nahrán a používán na nějakém veřejně přístupném serveru, tak nejjednodušší způsob je použít nástroj jako třeba SSL Labs Server Test. Zadejte URL, počkejte minutu nebo dvě a koukněte na výsledky. Informace, kterou hledáte, je na řádku „Revocation status“, přičemž „Good“ znamená, že certifikát je v pořádku, nezneplatněn a „Revoked“ znamená, že byl zneplatněn.
Zneplatněný certifikát v SSL Labs Server Testu
Možná máte TLS certifikát, který už nepoužíváte a chtěli byste zjistit, jestli byl zneplatněn. Má oblíbená certifikační autorita (CA) Let's Encrypt musela nedávno zneplatnit skoro dva miliony certifikátů kvůli špatnému ověřování CAA záznamů a uživatelé takto dotčených certifikátů je museli obnovit. Představte si třeba, že jste jedním z nich a z nějakého důvodu byste chtěli vědět, jestli váš starý certifikát byl certifikační autoritou zneplatněn.
Já jsem kvůli té chybě musel vyměnit certifikát pro canhas.report – můj projektík, na kterém ukazuji reportování z prohlížečů. Na crt.sh („Certificate Search“) si najdeme všechny certifikáty, které pro tuto doménu byly vystavené a všimneme si certifikátu vystaveného 3. března 2020. To je ten nový – ten předchozí byl vystaven 26. ledna, ten jsem musel nahradit a u něj bych rád znal jeho status.
crt.sh v části „Revocation“ ukazuje stav certifikátu tak jak jej vrací několik ověřovacích mechanismů. Certifikační autorita Let's Encrypt poskytuje seznam zneplatněných certifikátů (Certificate Revocation List, CRL) od roku 2022, takže u novějších certifikátů stav uvidíte, ale u staršího bude v řádku CRL jen „Unknown“. Můj certifikát se zatím nedostal do seznamů zneplatněných certifikátů, které si vytváří Google, Microsoft i Mozilla a pravděpodobně se tam už ani nikdy nedostane, takže u všech těchto mechanismů uvidíte „Not Revoked“.
I v novějších certifikátech od Let's Encrypt ale chybí položka „X509v3 CRL Distribution Points“ v části „X509v3 extensions“. Najdete tam jen OCSP v části Authority Information Access (AIA), viz níže, a i to brzy zmizí, protože Let's Encrypt plánuje vypnout OCSP servery pravděpodobně už v roce 2025.
Let's Encrypt adresu svého CRL v certifikátech neuvádí schválně, aby zbytečně nenutila HTTPS klienty ten relativně obrovský seznam stahovat při každém spojení. Adresa CRL lze zjistit z databáze certifikačních autorit CCADB.
Stav certifikátu v crt.sh
Odkaz „Check“ v řádce OCSP odešle dotaz na OCSP server (kterému se říká „OCSP responder“) uvedený v již zmíněném rozšíření certifikátu „Authority Information Access“. Pokud byste na něj teď klikli, tak už uvidíte „Revoked“, ale ještě včera to bylo „Good“, jakože nezneplatněn. Ujistěte se, že koukáte na koncový („leaf“) certifikát a ne na tzv. předcertifikát („precertificate“), což poznáte v řádku „Summary“ na stránce s detaily certifikátu.
V OCSP RFC v sekci 2.5 se píše, že „OCSP respondery mohou před-podepsat odpovědi, které udávají stav certifikátu v určitý čas“. Takže můžete vidět „nakešovanou“ odpověď, pojďme to ověřit.
Pomocí openssl
zkusíme ručně poslat dotaz na OCSP responder. openssl
je běžně dostupná utilitka na všech těch linuxech a dá se dokonce stáhnout i pro Windows. Budete potřebovat certifikát, který chcete zkontrolovat a certifikát vystavitele, což je snad ve všech případech tzv. „intermediate“ certifikační autorita, ne ta kořenová.
Let's Encrypt Authority X3 je „intermediate“ CA a zároveň vydavatel certifikátu pro canhas.report
Oba certifikáty musí být ve formátu PEM. Na příponě souboru nezáleží, ale musí obsahovat speciální hlavičku i patičku:
-----BEGIN CERTIFICATE----- [...] -----END CERTIFICATE-----
Pokud máte certifikát ve formátu DER, tak ho na PEM můžete převést pomocí:
openssl x509 -inform der -in certificate.cer -out certificate.pem
Certifikát můžete získat na docela dost místech, ale pojďme si oba potřebné stáhnout z crt.sh, když už ho používáme. Na stránce s detaily certifikátu klikněte na Certificate a ten soubor uložte (v tomhle případě bude mít jméno 2388791592.crt
).
Odkaz na stažení certifikátu na crt.sh
Pak níže klikněte na „Issuer“ a vyberte jeden z certifikátů:
Certifikáty vystavitelů na crt.sh
Pak znovu klikněte na Certificate a uložte soubor (15706126.crt
).
Budeme také potřebovat adresu OCSP responderu, kterou můžeme také získat z detailů zobrazených v crt.sh, případně ji můžete získat rovnou z certifikátu pomocí
$ openssl x509 -noout -ocsp_uri -in 2388791592.crt
Adresa responderu je v tomto případě http://ocsp.int-x3.letsencrypt.org
.
Teď konečně máme všechno co potřebujeme, abychom mohli ručně poslat dotaz pomocí OpenSSL a modulu ocsp
:
$ openssl ocsp -issuer 15706126.crt -cert 2388791592.crt -url http://ocsp.int-x3.letsencrypt.org
A tohle je výsledek („revoked“):
WARNING: no nonce in response Response verify OK 2388791592.crt: revoked This Update: Mar 6 23:00:00 2020 GMT Next Update: Mar 13 23:00:00 2020 GMT Reason: (UNKNOWN) Revocation Time: Mar 6 23:08:56 2020 GMT
Ještě včera se místo toho zobrazovalo „good“:
WARNING: no nonce in response Response verify OK 2388791592.crt: good This Update: Mar 5 22:00:00 2020 GMT Next Update: Mar 12 22:00:00 2020 GMT
Všimněte si, že odpověď byla před-podepsána, je nakešována a „This Update“ ukazuje čas, kdy ten stav („revoked“) byl platný. Odpověď je platná 7 dní, přičemž „Next Update“ je čas, kdy nejpozději bude dostupná novější informace o stavu certifikátu.
Jestli chcete vědět kdy ta odpověď byla před-podepsána, tak přidejte parametr -text
:
$ openssl ocsp -issuer 15706126.crt -cert 2388791592.crt -url http://ocsp.int-x3.letsencrypt.org -text
Výsledek je trochu delší, obsahuje totiž víc informací:
OCSP Request Data: Version: 1 (0x0) Requestor List: Certificate ID: Hash Algorithm: sha1 Issuer Name Hash: 7EE66AE7729AB3FCF8A220646C16A12D6071085D Issuer Key Hash: A84A6A63047DDDBAE6D139B7A64565EFF3A8ECA1 Serial Number: 036A2B3D1A79345759AF487420119EF947BC Request Extensions: OCSP Nonce: 0410113F6F29A10441061B371B7E2C294BDC OCSP Response Data: OCSP Response Status: successful (0x0) Response Type: Basic OCSP Response Version: 1 (0x0) Responder Id: C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3 Produced At: Mar 6 23:08:00 2020 GMT Responses: Certificate ID: Hash Algorithm: sha1 Issuer Name Hash: 7EE66AE7729AB3FCF8A220646C16A12D6071085D Issuer Key Hash: A84A6A63047DDDBAE6D139B7A64565EFF3A8ECA1 Serial Number: 036A2B3D1A79345759AF487420119EF947BC Cert Status: revoked Revocation Time: Mar 6 23:08:56 2020 GMT Revocation Reason: (UNKNOWN) (0x9) This Update: Mar 6 23:00:00 2020 GMT Next Update: Mar 13 23:00:00 2020 GMT Signature Algorithm: sha256WithRSAEncryption 98:9c:85:95:60:15:2f:a8:7b:75:8b:00:69:82:57:28:1b:f9: 10:4a:c1:fc:a9:37:9e:b7:4f:ce:d4:57:b0:16:f6:23:cc:39: fa:49:eb:ee:d7:19:57:d6:ca:5b:d9:c3:36:8d:60:25:14:93: aa:54:dc:b0:32:8f:52:8a:e3:60:37:d0:d2:9a:b3:33:8a:18: 63:e9:b4:a9:ef:5f:9b:77:ad:d1:cc:60:b0:2c:38:8f:4c:fb: 38:ee:91:b9:90:e0:ce:93:4b:8e:5c:c5:39:4a:1a:6e:0a:69: c2:ec:c6:fd:bf:44:c9:1b:18:f3:3a:63:ab:28:fb:b9:a3:52: 49:b5:16:49:85:6e:e1:f0:ca:48:9c:80:f3:5b:f7:ec:ef:32: dd:27:fb:f3:59:e8:71:85:92:28:70:07:d5:c4:2e:54:9e:f9: d9:70:f2:ee:26:e9:d5:ea:2a:fb:ff:53:58:2d:fb:bc:fb:9c: 74:dc:3d:30:b9:f4:59:57:d7:cd:d9:f5:74:62:92:bc:2e:b8: a2:ed:44:97:11:5e:03:d8:2b:f3:51:76:d2:e3:f4:37:ea:25: a6:f2:cc:54:d3:ec:98:d6:01:f0:16:fa:01:d9:27:58:53:39: 37:21:3f:1e:91:e3:8c:3d:32:66:ca:c5:0c:cb:42:c7:44:e4: 5e:70:43:9b WARNING: no nonce in response Response verify OK 2388791592.crt: revoked This Update: Mar 6 23:00:00 2020 GMT Next Update: Mar 13 23:00:00 2020 GMT Reason: (UNKNOWN) Revocation Time: Mar 6 23:08:56 2020 GMT
Čas vytvoření uvidíte v řádku „Produced At“ a důvod zneplatnění je neznámý („Unknown“). Další důvody jsou definovány v CRL RFC sekci 5.3.1, ale autority důvod uvádět nemusí.
Pokud byste náhodou použili OCSP responder certifikační autority, která nevydala vámi kontrolovaný certifikát, tak se zobrazí stav „unknown“ nebo „unauthorized“ nebo nějaká taková chyba.
Stejnou chybu můžete spatřit se špatným certifikátem vystavitele. To se může jednoduše stát, pokud omylem použijete tzv. řetěz certifikátů („certificate chain“), tedy třeba certifikát „intermediate“ certifikační autority s certifikátem kořenové autority v jednom souboru, místo pouze toho jednoho certifikátu. Takový řetěz získáte při stahování certifikátů z SSL Labs Server Testu, tak pozor na to.
Stažení řetězu certifikátů ze SSL Labs Server Testu, to není to pravé ořechové