Společnosti Microsoft, Google, Apple i Mozilla včera shodně oznámily, že z jejich webových prohlížečů Internet Explorer, Edge, Chrome, Safari a Firefox počátkem v polovině roku 2020 odstraní protokoly TLS 1.0 a TLS 1.1. Návštěvníci vašeho webu už je pravděpodobně stejně nepoužívají a tak je můžete na serveru vypnout už dnes. Pojďme si to pomocí „Handshake Simulation“ v SSL Labs Server Testu ověřit.
Protokol TLS (Transport Layer Security) je základem HTTPS a jeho první verze vyšla v roce 1999. Byl to nástupce protokolu SSL 3.0 z roku 1996, ten už prohlížeče nepodporují tři roky a váš server by taky dávno neměl. Platební brány a weby pracující s platebními kartami nesmí TLS 1.0 používat od léta 2018.

Verze TLS 1.1 vyšla o pár let později, v roce 2006, ale podobně jako TLS 1.0 používá překonané algoritmy MD5 a SHA-1. TLS verze 1.0 ani 1.1 prohlížeče běžně už nepoužívají:
- Google tvrdí, že s těmito protokoly je v Chrome uskutečněno jen 0,5 % HTTPS spojení (Na začátku ledna 2020 už jen 0,3 %), od verze 72 se navíc v developer tools objevuje varování při použití TLS 1.0 nebo 1.1, od 79 budou stránky načtené pomocí těchto protokolů označené jako „Not secure“ (nastavení můžete změnit na
chrome://flags/#show-legacy-tls-warnings
) a finálně přestanou být podporovány v Chrome 83, který by měl vyjít v půlce května 2020 (prohlížeč zobrazí celostránkovou chybu – nazývanou „interstitial“ – s kódemNET::ERR_SSL_OBSOLETE_VERSION
, která zatím půjde „prokliknout“)Varování v Chrome 72, vyzkoušejte si ho na odkazech z badssl.com
- V Edge je to prý 0,72 %, Microsoft odstraní podporu pro TLS 1.0 a 1.1 nejdříve v Edge 84 v červenci 2020, v IE 11 a v Edge Legacy (což je Edge před přechodem na Chromium) ji odstraní 8. září, v obojím to půjde stále ručně zapnout zpět
- V Safari údajně 0,36 %
- Firefox uskuteční 1,11 % všech HTTPS spojení pomocí TLS 1.0 a 0,09 % pomocí TLS 1.1,
od verze 74 (vyšla 10. března 2020) se navíc při pokusu o načtení stránky pomocí TLS 1.0 nebo 1.1 zobrazí celostránková chyba s kódemkvůli pandemii virové choroby COVID-19 a nepřipravenosti státních webů po celém světě (včetně webu českého Ministerstva zdravotnictví, který sice HTTPS umí, ale návštěvníky na něj naštěstí nepřesměrovává) byla tahle změna zase na chvíli vrácena zpět a do prohlížeče se dostala pozdějiSSL_ERROR_UNSUPPORTED_VERSION
a tlačítkem pro povolení těchto zastaralých protokolů – pro opětovné zakázání musíte vabout:config
nastavitsecurity.tls.version.enable-deprecated
nafalse
Pokud server tyto protokoly stále podporuje, tak hrozí, že útočník donutí prohlížeč použít je namísto bezpečného TLS 1.2 nebo TLS 1.3, ačkoliv moderní browsery takový „fallback“ odstranily již před několika lety (v Chrome 50, Firefox 37). Bylo by tedy vhodné je na serveru zakázat, od března 2021 to dokonce „nařizuje“ RFC 8996, ale předtím je dobré si zjistit, jaké prohlížeče tyto protokoly vyžadují. Už jich moc není, v seznamu nenajdete ani jeden moderní browser.
Handshake simulation
Prohlížeče, které se po vypnutí TLS 1.0 a 1.1 na váš server nepřipojí, můžete zjistit třeba otestováním vlastního webu pomocí nástroje SSL Labs Server Test. Do políčka Hostname zadejte vaší doménu, stiskněte Submit
a chvíli počkejte na dokončení testu.

Můj web dostal v hodnocení známku A+, nejlepší možnou, jak překvapivé
Test vyzkouší nastavení HTTPS na vašem webu, ten by měl ideálně získat známku A nebo A+, kterou od ledna 2020 dostanete pouze pokud máte staré TLS zakázané. Na hodnocení má vliv několik nastavení, které jsem se pokusil krátce vysvětlit ve své přednášce o SSL Labs. Ale tenhle článek není o známkách, níže se budu věnovat převážně jen protokolům TLS.
Ve výsledcích pod informacemi o certifikátech začíná sekce Configuration. V ní uvidíte, které protokoly server podporuje a v části Handshake Simulation jsou uvedeny testované prohlížeče, protokoly a šifry, které ke spojení používají.

Část výsledků simulace prohlížečů pro náhodný web
„Handshake“ je počáteční část HTTPS spojení, během které se prohlížeč a server domluví na tom, jaké protokoly, šifry a šifrovací klíče budou používat. SSL Labs zkouší simulovat cca 50 různých prohlížečů a výsledky této domluvy pak zobrazí v přehledné tabulce.
Řádek po řádku
Pojďme si rozebrat třeba hned ten první řádek, do detailů kryptografie ale zacházet nebudeme, nebojte:

- Android 2.3.7
- Simulovaný prohlížeč (obecně HTTPS klient) a verze
- No SNI2
- Poznámka, která v tomto případě říká, že Android 2.3.7 nepodporuje SNI (Server Name Indication), což je technologie dovolující na jedné IP adrese provozovat více webů na HTTPS, každý s vlastním certifikátem (ta „2“ v „SNI2“ je jen odkaz na poznámku pod čarou) – ve finále to znamená, že pokud chcete podporovat i takto staré Androidy, tak pro váš web musíte mít vyhrazenou IP adresu
- RSA 2048 (SHA1)
- RSA znamená spoustu věcí, v tomto případě ale označuje typ certifikátu a soukromého klíče, 2048 pak velikost toho klíče a SHA1 algoritmus použitý pro podpis certifikátu, který by se již běžně používat neměl
- TLS 1.0
- Použitý šifrovací protokol ve verzi, které se zrovna náhodou chceme zbavit
- TLS_RSA_WITH_AES_128_CBC_SHA
- Použitá šifra, přesněji „cipher suite“, která určuje, jak proběhne výměna klíčů a jaký šifrovací algoritmus se použije
- No FS
- „FS“ znamená Forward Secrecy a test nám zde naznačuje, že „cipher suite“ se tímto označením nemůže pyšnit a že pokud by mizera získal soukromý klíč ze serveru, tak by mohl rozšifrovat již proběhlou zaznamenanou komunikaci i tu, která teprve proběhne
A teď ten poslední řádek z předchozího obrázku:

- Android 7.0
- O dost novější verze, že
- EC 256 (SHA256)
- Byl použit certifikát i soukromý klíč využívající Elliptic-curve cryptography, EC klíče i certifikáty jsou o dost menší (klíč má „jen“ 256 bitů) a zpracovávají se rychleji, podpora je také výborná (já na svém webu používám už jenom EC certifikáty); SHA256 je pak označení pro podpisový algoritmus z rodiny hashovacích funkcí SHA-2, která by se pro certifikáty měla používat
- TLS 1.2 > h2
- Spojení proběhlo pomocí TLS 1.2, „> h2“ naznačuje, že bylo využito protokolu HTTP/2
- TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
- Použitá šifra, resp. „cipher suite“
- ECDH x25519
- Upřesnění výměny klíčů v dané „cipher suite“, který proběhla pomocí algoritmu Elliptic-curve Diffie–Hellman s eliptickou křivkou označovanou jako X25519
- FS
- „Cipher suite“ podporuje Forward Secrecy, takže mizera, který se dostane k soukromému klíči ze serveru nedokáže minulou ani budoucí komunikace dešifrovat
Pohledem na všechny řádky zjistíte, který prohlížeč by použil TLS 1.0 nebo 1.1. Pokud takové prohlížeče již nechcete nebo nemusíte podporovat, tak tyto zastaralé protokoly v konfiguraci vašeho serveru vypněte. Nedávno to udělal např. i Slevomat, viz výsledky testu. A když to mohl vypnout Slevomat, tedy komerční web pro velmi širokou veřejnost, tak vy můžete nejspíš také. Správce serveru by to měl zvládnout, v Apache k tomu slouží direktiva SSLProtocol
, v nginx ssl_protocols
.
Nepodporované prohlížeče
Na konci sekce Handshake Simulation najdete pod hlavičkou Not simulated clients (Protocol mismatch) prohlížeče, které se v defaultním nastavení chtěly připojit již nepodporovaným protokolem. Pro můj web ta podstatná část vypadá takto, přičemž na obrázku chybí ještě stará Java, knihovna OpenSSL z dob, kdy se po Zemi ještě proháněli dinosauři a Safari verze 5 a 6 na OS X:

Na můj web se nepřipojí ani Chrome 49 na Windows XP, protože ten by potřeboval RSA certifikát, který jsem přestal používat. Pokud browser zvládne TLS 1.2, tak zvládne i EC certifikát, s touhle jedinou výjimkou, takže je můžete v klidu používat. Pokud byste stále potřebovali podporovat i Chrome na Windows XP, tak můžete použít oba typy certifikátů zároveň, pokud to váš server umí a Apache i nginx to umí.
Vypněte nepoužívané věci
Když už budete v tom vypínání starých TLS, tak stejně můžete postupovat u „cipher suites“. SSL Labs Server Test některé „cipher suites“ označí jako slabé („weak“), některé dokonce jako „insecure“, ale pokud je žádný vámi podporovaný prohlížeč nepoužívá, tak je z konfigurace serveru můžete také odstranit. Můj server nabízí jen 5 „cipher suites“, konfiguraci jsem převzal z generátoru od Mozilly, přičemž jsem použil profil „Modern“.
Pokud se o HTTPS zajímáte ještě víc, tak vás rád přivítám na dalším termínu mého školení HTTPS (nejbližší termín: 20.–21. června 2022 online).
Mohlo by vás také zajímat
- Školení HTTPS pro vývojáře a správce (nejbližší termín: 20.–21. června 2022 online)
- Vysvětlení proč prohlížeče pomalu skrývají zámeček u HTTPS stránek
- Modernizing TLS connections, kde Microsoft oznamuje ukončení podpory TLS 1.0 a 1.1
- Modernizing Transport Security, kde to samé dělá Google
- Deprecation of Legacy TLS 1.0 and 1.1 Versions, …a Apple
- Removing Old Versions of TLS …a Mozilla
Aktualizace článku
23. března 2021 RFC 8996 formálně „vypíná“ TLS 1.0 a 1.1
2. dubna 2020 Upřesnění datumů u Chrome a Edge
15. března 2020 Vyšel Firefox 74, při načtení stránek pomocí starého TLS zobrazí chybu tak už zase nezobrazí
1. února 2020 SSL Labs hodnotí servery s povoleným TLS 1.0 nebo 1.1 známkou B nebo horší
14. ledna 2020 Chrome flag pro zobrazování Not secure při použití zastaralé verze TLS
5. listopadu 2019 TLS 1.0 a 1.1 budou z Chrome odstraněny ve verzi 81
30. ledna 2019 Chrome 72 varuje při použití TLS 1.0 nebo TLS 1.1
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í
(13.–16. června 2022 )
HTTPS pro vývojáře a správce
(20.–21. června 2022 )