Trumpai: solidi TLS konfigūracija žiniatinklio serveriui siūlo tik TLS 1.2 ir TLS 1.3, naudoja šifrų rinkinius su Forward Secrecy ir autentifikuotu šifravimu (AES-GCM, ChaCha20-Poly1305), o sertifikatas turi ECDSA arba pakankamai ilgą RSA raktą ir atsinaujina automatiškai. Orientyrą duoda BSI (Vokietijos federalinė informacijos saugumo tarnyba) gairės TR-02102-2 ir TLSRef Server-Side TLS rekomendacijos. Rezultatą patikrinkite iš išorės ir nepamirškite ryšių, kuriuos užmezga pats PHP.
Kodėl senos TLS nuostatos išgyvena taip ilgai
Naršyklėje yra spynelė, vadinasi, šifravimas sutvarkytas. Taip galvoja daugelis operatorių, todėl TLS konfigūracija dažnai metų metus nesikeičia. Ji tuomet kilusi iš serverio įrengimo laikų, nukopijuoto šablono ar valdymo skydelio numatytųjų reikšmių.
Problema ta, kad rekomendacijos keičiasi. Protokolų versijos keičiamos naujomis, metodai laikomi silpnais, atsiranda naujų rakto mainų metodų. BSI naujausią TR-02102 paskelbė versija 2026-01 nuo 2026-01-27 ir joje jau nurodo hibridinius postkvantinius metodus TLS 1.3. Kas savo nuostatų nežiūrėjo daug metų, labai tikėtina, nebėra naujausios būklės.
Kas dabar po PHP2Shell vis tiek tikrina serverius, TLS konfigūraciją gali peržiūrėti vienu prisėdimu. Ji PHP spragos neuždaro, bet priklauso kiekvienam tvarkingam sutvirtinimui.
Kuo remiasi gera TLS konfigūracija žiniatinklio serveriui
Du šaltiniai ypač naudingi operatoriams Europoje. BSI TR-02102 vertina kriptografinius metodus; 2 dalis nagrinėja TLS. Ji skirta pirmiausia kūrėjams ir planuotojams ir institucijoms bei reguliuojamoms sritims dažnai yra mastelis. Server-Side TLS rekomendacijos, anksčiau tvarkytos Mozilla wiki, dabar tęsiamos TLSRef ir pateikia konkrečius, nukopijuojamus profilius.
TLSRef 6.0 versijoje skiria du profilius:
| Požymis | Intermediate (daugumai svetainių) | Modern |
|---|---|---|
| Protokolai | TLS 1.2 ir TLS 1.3 | tik TLS 1.3 |
| Šifrų rinkiniai TLS 1.2 | ECDHE su AES-GCM arba ChaCha20-Poly1305 | jokių |
| Rakto mainų grupės | X25519MLKEM768, X25519, prime256v1, secp384r1 | kaip Intermediate |
| Sertifikatas | rekomenduojamas ECDSA P-256 arba RSA 2048 bitų | ECDSA P-256 |
| Sertifikato galiojimas | rekomenduojama 90 dienų, daugiausia 366 dienos | 90 dienų |
| HSTS max-age | dveji metai | dveji metai |
Viešoms svetainėms Intermediate yra įprastas atspirties taškas. Profilis atmeta labai senus įrenginius, bet apima dabartines naršykles ir operacines sistemas. Hibridinei grupei X25519MLKEM768 reikia naujos TLS bibliotekos. Prieš ją įrašydami patikrinkite, ar jūsų OpenSSL versija ją pažįsta.
Nginx ir Apache: saugus atspirties taškas
Toliau pateikti pavyzdžiai įgyvendina Intermediate profilį. Keliai yra vietos žymekliai, šifrų rinkinių sąrašas galioja TLS 1.2; TLS 1.3 turi savus saugius numatytuosius metodus.
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
Antras server blokas nuolat nukreipia nešifruotus kreipinius į HTTPS. Nukreipimas turėtų rodyti tiesiai į galutinį adresą, o ne eiti per kelias tarpines stotis. Po to patikrinkite ir įterptus išteklius: paveikslėliai, scenarijai ar šriftai, kurie dar kraunami per HTTP, naršyklėje sukelia įspėjimus arba yra blokuojami.
Nuostata, kad eiliškumą renkasi klientas, atitinka TLSRef rekomendaciją: visi siūlomi metodai laikomi saugiais, o įrenginiai be AES spartinimo taip gali pirmenybę teikti ChaCha20. Po kiekvieno pakeitimo konfigūraciją išbandykite (nginx -t arba apachectl configtest) ir tarnybą įkelkite iš naujo. Tinkamą HSTS antraštę ir kitus naršyklės nurodymus aprašo vadovas Svetainių saugumo antraštės.
Valdymo skydeliai, tokie kaip Plesk ar cPanel, savo sugeneruotuose failuose dažnai perrašo jūsų pakeitimus. TLS nuostatas ten nustatykite per skydelio numatytus nustatymus ar šablonus.
Sertifikatai: raktas, grandinė, atnaujinimas
Didelė dalis TLS problemų praktikoje neturi nieko bendra su šifrų rinkiniais, o susijusios su sertifikatais. Tipinės klaidos: nepilna grandinė, kai trūksta tarpinio sertifikato, pasibaigę sertifikatai šalutiniuose domenuose ir privatūs raktai su pernelyg plačiomis failų teisėmis.
Padeda trys taisyklės:
- Atnaujinkite automatiškai ir stebėkite atnaujinimą. Trumpos galiojimo trukmės, kokias rekomenduoja TLSRef, praktiškos tik su automatizavimu.
- Saugokite privačius raktus: skaitomi tik root ir žiniatinklio serverio procesui, niekada žiniatinklio šakniniame kataloge, niekada saugykloje (repository).
- Surinkite visus vardus: pagrindinis domenas, www, subdomenai parduotuvei, parengiamajai aplinkai (staging), pašto žiniatinklio sąsajai ir valdymo skydeliams.
Kas sertifikatus naudoja keliose vietose, pavyzdžiui, CDN, apkrovos paskirstytuve ir kilmės serveryje, turėtų vesti apžvalgą: kuris sertifikatas kur įdiegtas, kas jį atnaujina ir kada baigiasi. Be šios apžvalgos pasibaigęs sertifikatas dažnai pastebimas tik tada, kai pradeda skambinti klientai.
Kaip patikrinti konfigūraciją iš išorės
Šios komandos yra grynas tikrinimas ir nieko nekeičia. Pakeiskite pagrindinio kompiuterio vardą savu:
# TLS 1.3 ir TLS 1.2 turėtų veikti
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 turėtų nepavykti
openssl s_client -connect www.example.de:443 -servername www.example.de -tls1_1 </dev/null
# Pateikiamo sertifikato galiojimas ir savininkas
openssl s_client -connect www.example.de:443 -servername www.example.de </dev/null 2>/dev/null | openssl x509 -noout -subject -dates
TLS 1.1 bandymo nesėkmė gali reikšti ir tai, kad jūsų vietinė OpenSSL versija senojo protokolo apskritai nebesiūlo. Pilnai ataskaitai apie visus siūlomus metodus tinka specializuotas TLS skeneris. Tikrinkite kiekvieną subdomeną atskirai, nes jie dažnai veikia su savomis nuostatomis.
Pamirštama: TLS ten, kur pats PHP yra klientas
PHP programos pačios užmezga daug ryšių: su mokėjimo teikėjais, siuntų paslaugų teikėjais, sąsajomis, pašto serveriais ir duomenų bazėmis. Čia dažniausia klaida yra ne silpna nuostata, o išjungtas sertifikato tikrinimas, dažnai kaip greitas sprendimas kūrimo problemai.
<?php
// Saugu: sertifikatas ir pagrindinio kompiuterio vardas tikrinami (palikti numatytąjį elgesį)
$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);
Kode ieškokite CURLOPT_SSL_VERIFYPEER su false ir verify_peer srautų kontekstuose. Kiekviena rasta vieta praktiškai panaikina TLS apsaugą šiam ryšiui. Kur tarnybos yra už CDN, ir ruožas tarp CDN ir kilmės serverio turėtų naudoti galiojantį, patikrinamą sertifikatą. Kitų žiniatinklio serverio nuostatų PHP aplinkoms rasite straipsnyje Nginx saugus konfigūravimas PHP, viso sutvirtinimo mastelius straipsnyje CIS Benchmarks ir BSI moduliai.
Kaip PHP SOS padeda konkrečiai?
- Surenkame visus pagrindinių kompiuterių vardus ir tarnybas su TLS, įskaitant valdymo skydelius, parengiamąsias aplinkas ir pašto žiniatinklio sąsajas.
- Nuostatas sulyginame su TR-02102 ir tinkamu TLSRef profiliu ir dokumentuojame sąmoningus nukrypimus.
- Sertifikatus perjungiame į automatinį atnaujinimą su stebėsena.
- Programos kode ieškome išjungtų sertifikatų tikrinimų ir parodome pataisymą.
TLS yra mūsų PHP žiniatinklio serverių sutvirtinimo dalis; ryšį su dabartine padėtimi aiškina Kas yra PHP2Shell?.
Dažni klausimai
Ar vis dar turiu siūlyti TLS 1.0 ir TLS 1.1?
Paprastai ne. Dabartinės rekomendacijos, pavyzdžiui, TLSRef Intermediate profilis, kaip apatinę ribą nustato TLS 1.2. Kas senesnių protokolų reikia senoms įrangoms, turėtų tai nuspręsti sąmoningai, dokumentuoti ir apriboti atskira tarnyba.
Ar nemokamas sertifikatas mažiau saugus nei pirktas?
Šifravimui skirtumo nėra. Lemia rakto tipas, rakto ilgis, pilna sertifikatų grandinė ir patikimas automatinis atnaujinimas. Skirtumų yra tikrinimo apimtyje, galiojimo trukmėje ir teikėjo aptarnavime.
Ar pakanka HTTPS tarp lankytojo ir CDN?
Ne. Ir ryšys tarp CDN ir kilmės serverio turėtų būti šifruotas ir tikrinti kilmės sertifikatą. Kitu atveju duomenys antrame ruože keliauja tinklu nešifruoti arba netikrinti.
Ką TLS turi bendra su PHP2Shell?
Tiesiogiai nieko. TLS saugo duomenis jų perdavimo kelyje, o PHP2Shell paveikia PHP interpretatorių serveryje. Šifruotas ryšys patikimai perneša ir atakos užklausas, todėl PHP atnaujinimas lieka privalomas nepriklausomai nuo to.