Od roku 2020 je platnost HTTPS certifikátů omezena na 1 rok, přesněji 398 dní, o historii a důvodech jsem tu již psal. Ale tohle omezení platí jen pro certifikáty vydané nějakou veřejnou certifikační autoritou (CA), tedy takovou, kterou do úložiště důvěryhodných kořenových certifikátů v operačním systému a prohlížečích přidal výrobce.
Maximální délka platnosti certifikátů 1 rok neplatí pro certifikáty vystavené privátní kořenovou autoritou („root CA“), kterou přidal uživatel nebo správce počítače ať už ručně, nebo pomocí programů jako např. certutil
nebo mkcert
. Ostatně o této výjimce píše i Apple na stránce, na které informuje o zkrácení na 398 dní: This change will not affect certificates issued from user-added or administrator-added Root CAs.
Uživatelem přidaná certifikační autorita v Keychain Access na macOS
Jenže když v Safari zkusíte načíst stránku, která používá např. 5letý certifikát vystavený takovou privátní CA, tak prohlížeč stránku nezobrazí a napíše jen:
Safari cannot open the page because it could not establish a secure connection to the server.
Nic víc, žádný 🔓 This Connection Is Not Private, žádný vysvětlení, žádný „pusťte mě dál, (ne)vím co dělám“ jako třeba v případě expirovaného nebo self-signed certifikátu.
To naznačuje, že v Safari existuje nějaké omezení pro maximální délku platnosti i pro certifikáty vystavené privátními autoritami. Vygůglovat něco rozumnýho a vyzdrojovanýho se mi vůbec nedařilo a tak jsem našel klíč ke své privátní CA (jmenuje se „exploited CA“), nahodil openssl
, web server, meka a kalkulačku a rozhodl jsem se to empiricky zjistit. Certifikát s platností 398 dní v Safari fungoval, 800 dní (2×398 + 4 dny) taky, ale s platností 1592 dní (4×398) už ne.
O šestnáct certifikátů později jsem metodou půlení intervalu mezi 800 a 1592 došel k certifikátu s platností 825 dní. To číslo se mi asi zdálo nějaký podezřelý a tak možná proto mě přesně v tu chvíli napadlo, že by pro privátní CA mohl přece platit předchozí limit, který… nebudu vás napínat, byl 825 dní. Apple o tom samozřejmě píše v dokumentaci:
All TLS server certificates must comply with these new security requirements in iOS 13 and macOS 10.15 […] TLS server certificates must have a validity period of 825 days or fewer (as expressed in the NotBefore and NotAfter fields of the certificate).
Důležité je tam to „all TLS certificates“, ale tuhle stránku jsem pochopitelně předtím nenašel. A i kdyby jo, tak by mi ta souvislost stejně asi nedošla.
Certifikát s platností 825 dní tak samozřejmě fungoval, ten s platností 826 dní už ne.
Certifikát pro snafu.cz
platný 825 dní, vystavený mnou přidanou CA, v prohlížeči certifikátů v Safari
Chrome i Firefox ale klidně zobrazí stránku s certifikátem od privátní CA, který platí 10 let, tyhle browsery žádné takové omezení pro uživatelem přidané certifikační autority nemají.
10letý certifikát (3650 dní) v prohlížeč certifikátů v Chrome, pole Common Name si nevšímejte 😅
10letý certifikát (3650 dní) v prohlížeč certifikátů ve Firefoxu
Ale jestli chcete mít např. vývojové prostředí dostupné i pro Safari, vaše interní certifikační autorita musí vystavovat certifikáty s platností maximálně 825 dní, což jsou 2 roky, 3 měsíce a pár dní. A podobně jako u toho posledního zkrácení za to „může“ Apple 😊
Ostatně i proto si dovolím tvrdit, že platnost certifikátů od uživatelem přidaných autorit je fakticky omezena na 2 roky i přesto, že tomu tak je jen v jednom prohlížeči. U aktuálního omezení platnosti na 398 dní pro certifikáty od veřejných CA se doporučuje vystavovat certifikáty s platnosti nejdéle 397 dní, nejspíš kdyby náhodou něco někde špatně počítalo vteřiny při změně času apod., a tak i v tomto případě bych doporučil nastavit maximálně 824 dní. A nejlépe si to zjednodušit nebo dokonce automatizovat tak, abyste mohli v klidu vystavovat certifikáty s platností maximálně rok nebo klidně i méně.