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).

Když máte adresu serveru

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

Zneplatněný certifikát v SSL Labs Server Testu

Když máte certifikát

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ů. U mého certifikátu v řádku CRL uvidíte „Unknown“, protože Let's Encrypt seznam zneplatněných certifikátů (Certificate Revocation List, CRL) neposkytuje, což si můžete potvrdit o kousek níže, v části „X509v3 extensions“. Informace o „X509v3 CRL Distribution Points“ tam chybí, najdete tam jen OCSP v části Authority Information Access (AIA). Seznam zneplatněných certifikátů by u Let's Encrypt byl obrovský a tak se ho ani nesnaží vytvářet. 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 ani nikdy nedostane, takže u všech těchto mechanismů uvidíte „Not Revoked“.

Stav certifikátu v crt.sh

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.

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.

Získání certifikátu

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“ certifikační autorita

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

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

Certifikáty vystavitelů na crt.sh

Pak znovu klikněte na Certificate a uložte soubor (15706126.crt).

Před-podepsané OCSP odpovědi

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 po­mocí

$ 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

Stažení řetězu certifikátů ze SSL Labs Server Testu, to není to pravé ořechové

Michal Špaček

Michal Špaček

Vyvíjím webové aplikace, zajímá mě jejich bezpečnost. Nebojím se o tom mluvit veřejně, hledám hranice tak, že je posouvám. Chci naučit webové vývojáře stavět bezpečnější a výkonnější weby a aplikace.

Veřejná školení

Zvu vás na následující školení, která pořádám a vedu:

Bezpečnost PHP aplikací
(20.–23. října 2020 , 14.–17. prosince 2020 )

HTTPS pro vývojáře a správce
(26.–27. října 2020 , 21.–22. prosince 2020 )