Stručně: Spolehlivá konfigurace TLS pro webserver nabízí jen TLS 1.2 a TLS 1.3, používá šifrovací sady s forward secrecy a autentizovaným šifrováním (AES-GCM, ChaCha20-Poly1305) a certifikát s klíčem ECDSA nebo dostatečně dlouhým klíčem RSA, který se obnovuje automaticky. Orientaci dávají směrnice BSI TR-02102-2 a doporučení Server-Side TLS od TLSRef. Výsledek ověřte zvenčí a nezapomeňte na spojení, která vytváří samotné PHP.
Proč staré nastavení TLS přežívá tak dlouho
Zámek v prohlížeči tam je, takže šifrování je vyřízeno. Tak uvažuje mnoho provozovatelů, a proto zůstává konfigurace TLS často roky beze změny. Pochází pak z doby zřízení serveru, ze zkopírované šablony nebo z výchozích hodnot panelu.
Problém: doporučení se mění. Verze protokolů se nahrazují, postupy se považují za slabé, přibývají nové metody výměny klíčů. BSI (německý Spolkový úřad pro informační bezpečnost) naposledy zveřejnil TR-02102 ve verzi 2026-01 ze dne 27. 1. 2026 a upozorňuje v ní již na hybridní postkvantové postupy pro TLS 1.3. Kdo se na své nastavení několik let nepodíval, s vysokou pravděpodobností už není na aktuálním stavu.
Kdo právě po PHP2Shell tak jako tak kontroluje servery, může se na konfiguraci TLS podívat zároveň. Zranitelnost PHP neuzavře, ale ke každému řádnému hardeningu patří.
Čím se řídí dobrá konfigurace TLS pro webserver
Dva zdroje jsou pro provozovatele v Německu obzvlášť užitečné. BSI TR-02102 hodnotí kryptografické postupy; část 2 se věnuje TLS. Je určena především vývojářům a projektantům a pro úřady a regulované oblasti bývá měřítkem. Doporučení Server-Side TLS, dříve vedená na wiki Mozilly, se dnes dále vedou pod názvem TLSRef a poskytují konkrétní profily, které lze zkopírovat.
TLSRef ve verzi 6.0 rozlišuje dva profily:
| Vlastnost | Intermediate (pro většinu webů) | Modern |
|---|---|---|
| Protokoly | TLS 1.2 a TLS 1.3 | jen TLS 1.3 |
| Šifrovací sady TLS 1.2 | ECDHE s AES-GCM nebo ChaCha20-Poly1305 | žádné |
| Skupiny pro výměnu klíčů | X25519MLKEM768, X25519, prime256v1, secp384r1 | jako Intermediate |
| Certifikát | doporučen ECDSA P-256 nebo RSA 2048 bitů | ECDSA P-256 |
| Doba platnosti certifikátu | doporučeno 90 dnů, nejvýše 366 dnů | 90 dnů |
| HSTS max-age | dva roky | dva roky |
Pro veřejné weby je běžným výchozím bodem Intermediate. Profil vylučuje velmi stará zařízení, ale pokrývá aktuální prohlížeče a operační systémy. Hybridní skupina X25519MLKEM768 vyžaduje aktuální knihovnu TLS. Než ji zapíšete, ověřte, zda ji vaše verze OpenSSL zná.
Nginx a Apache: bezpečný výchozí bod
Následující příklady zavádějí profil Intermediate. Cesty jsou zástupné hodnoty, seznam šifrovacích sad platí pro TLS 1.2; TLS 1.3 přináší vlastní bezpečné výchozí postupy.
server {
listen 443 ssl;
server_name www.example.de;
ssl_certificate /etc/ssl/example/fullchain.pem;
ssl_certificate_key /etc/ssl/example/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers off;
}
server {
listen 80;
server_name www.example.de;
return 301 https://$host$request_uri;
}
SSLProtocol -all +TLSv1.2 +TLSv1.3
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305
SSLHonorCipherOrder off
Druhý blok server trvale přesměrovává nešifrované požadavky na HTTPS. Přesměrování by mělo mířit přímo na konečnou adresu a neprocházet několika mezistanicemi. Poté zkontrolujte i vložené zdroje: obrázky, skripty nebo písma, které se stále načítají přes HTTP, vyvolávají v prohlížeči varování nebo jsou blokovány.
Nastavení, že pořadí volí klient, odpovídá doporučení TLSRef: všechny nabízené postupy se považují za bezpečné a zařízení bez hardwarové akcelerace AES tak mohou upřednostnit ChaCha20. Po každé změně otestujte konfiguraci (nginx -t, resp. apachectl configtest) a službu znovu načtěte. Vhodnou hlavičku HSTS a další pokyny pro prohlížeče popisuje příručka Bezpečnostní hlavičky pro weby.
Panely jako Plesk nebo cPanel často přepisují vlastní změny ve vygenerovaných souborech. Požadavky na TLS tam nastavujte pomocí určených nastavení nebo šablon panelu.
Certifikáty: klíč, řetězec, obnovení
Velká část problémů s TLS v praxi nemá nic společného se šifrovacími sadami, ale s certifikáty. Typické chyby jsou neúplný řetězec, ve kterém chybí zprostředkující certifikát, prošlé certifikáty na vedlejších doménách a soukromé klíče s příliš širokými právy k souborům.
Pomáhají tři pravidla:
- Obnovujte automaticky a obnovování sledujte. Krátké doby platnosti, jaké TLSRef doporučuje, jsou praktické jen s automatizací.
- Chraňte soukromé klíče: čitelné jen pro root a proces webserveru, nikdy ve webrootu, nikdy v repozitáři.
- Zachyťte všechna jména: hlavní doména, www, subdomény pro e-shop, staging, webové rozhraní pošty a panely.
Kdo používá certifikáty na více místech, například na CDN, load balanceru a původním serveru, měl by vést přehled: který certifikát je kde nainstalován, kdo ho obnovuje a kdy vyprší. Bez tohoto přehledu se prošlý certifikát často pozná, až když se ozvou zákazníci.
Jak zkontrolovat konfiguraci zvenčí
Následující příkazy jsou čistě kontrolní a nic nemění. Název hostitele nahraďte svým vlastním:
# TLS 1.3 a TLS 1.2 by měly fungovat
openssl s_client -connect www.example.de:443 -servername www.example.de -tls1_3 </dev/null
openssl s_client -connect www.example.de:443 -servername www.example.de -tls1_2 </dev/null
# TLS 1.1 by mělo selhat
openssl s_client -connect www.example.de:443 -servername www.example.de -tls1_1 </dev/null
# Doba platnosti a držitel doručovaného certifikátu
openssl s_client -connect www.example.de:443 -servername www.example.de </dev/null 2>/dev/null | openssl x509 -noout -subject -dates
Selhání testu TLS 1.1 může být způsobeno i tím, že vaše lokální verze OpenSSL starý protokol už vůbec nenabízí. Pro úplnou zprávu o všech nabízených postupech se hodí specializovaný skener TLS. Kontrolujte přitom každou subdoménu zvlášť, protože často běží s vlastním nastavením.
Zapomenuté: TLS tam, kde je PHP samo klientem
Aplikace PHP samy vytvářejí mnoho spojení: k platebním službám, dopravcům, rozhraním, poštovním serverům a databázím. Nejčastější chybou zde není slabé nastavení, ale vypnuté ověřování certifikátu, často jako rychlé řešení problému při vývoji.
<?php
// Bezpečně: certifikát a název hostitele se ověřují (ponechte výchozí chování)
$ch = curl_init('https://api.partner.example/v1/status');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => true,
CURLOPT_SSL_VERIFYHOST => 2,
CURLOPT_TIMEOUT => 10,
]);
$antwort = curl_exec($ch);
Vyhledejte v kódu CURLOPT_SSL_VERIFYPEER s hodnotou false a verify_peer v kontextech streamů. Každý nález prakticky ruší ochranu TLS pro dané spojení. Kde služby leží za CDN, měl by i úsek mezi CDN a původním serverem používat platný, ověřovaný certifikát. Další nastavení webserveru pro prostředí PHP najdete v článku Bezpečná konfigurace Nginx pro PHP, měřítka pro celkový hardening v článku Benchmarky CIS a moduly BSI.
Jak konkrétně pomáhá PHP SOS?
- Zaznamenáme všechny názvy hostitelů a služby s TLS, včetně panelů, stagingu a webových rozhraní pošty.
- Nastavení porovnáme s TR-02102 a vhodným profilem TLSRef a zdokumentujeme vědomé odchylky.
- Certifikáty převedeme na automatické obnovování se sledováním.
- V kódu aplikace hledáme vypnutá ověření certifikátů a ukážeme opravu.
TLS je jedním z prvků našeho hardeningu serveru pro webservery s PHP; souvislost s aktuální situací vysvětluje stránka Co je PHP2Shell?.
Časté dotazy
Musím ještě nabízet TLS 1.0 a TLS 1.1?
Zpravidla ne. Aktuální doporučení, například profil Intermediate z TLSRef, stanovují jako spodní hranici TLS 1.2. Kdo potřebuje starší protokoly pro stará zařízení, měl by to rozhodnout vědomě, zdokumentovat to a omezit na samostatnou službu.
Je bezplatný certifikát méně bezpečný než zakoupený?
Pro šifrování to žádný rozdíl nedělá. Rozhodující jsou typ a délka klíče, úplný řetězec certifikátů a spolehlivé automatické obnovování. Rozdíly jsou v rozsahu ověření, době platnosti a službách poskytovatele.
Stačí HTTPS mezi návštěvníkem a CDN?
Ne. I spojení mezi CDN a původním serverem by mělo být šifrované a mělo by ověřovat certifikát původního serveru. Jinak data na druhém úseku putují sítí nešifrovaně nebo neověřeně.
Co má TLS společného s PHP2Shell?
Přímo nic. TLS chrání data na přenosové cestě, PHP2Shell se týká interpretu PHP na serveru. Šifrované spojení spolehlivě přenáší i útočné požadavky, proto zůstává aktualizace PHP povinná bez ohledu na to.