Ukratko: Solidna TLS konfiguracija web-poslužitelja nudi samo TLS 1.2 i TLS 1.3, koristi cipher suites s Forward Secrecy i autentificiranim šifriranjem (AES-GCM, ChaCha20-Poly1305) te certifikat s ECDSA ključem ili dovoljno dugim RSA ključem koji se automatski produljuje. Orijentaciju daju smjernica BSI-ja TR-02102-2 (BSI je njemački Savezni ured za informacijsku sigurnost) i Server-Side-TLS preporuke iz TLSRef-a. Rezultat provjerite izvana i ne zaboravite veze koje PHP sam uspostavlja.
Zašto stare TLS postavke tako dugo opstaju
Lokot u pregledniku je tu, dakle šifriranje se smatra riješenim. Tako misle mnogi operateri i zato TLS konfiguracija često godinama ostaje nepromijenjena. Tada potječe iz vremena postavljanja poslužitelja, iz kopiranog predloška ili iz zadanih vrijednosti panela.
Problem: preporuke se mijenjaju. Verzije protokola se zamjenjuju, postupci se smatraju slabima, dodaju se novi postupci razmjene ključeva. BSI je TR-02102 zadnji put objavio u verziji 2026-01 od 27. 1. 2026. i u njoj već upućuje na hibridne postkvantne postupke za TLS 1.3. Tko godinama nije pogledao svoje postavke, s velikom vjerojatnošću više nije na aktualnom stanju.
Tko ionako upravo provjerava poslužitelje nakon PHP2Shella, TLS konfiguraciju može pogledati u istom koraku. Ona ne zatvara PHP ranjivost, ali pripada svakom urednom ojačavanju.
Na što se oslanja dobra TLS konfiguracija web-poslužitelja
Dva su izvora za operatere u Europi osobito korisna. BSI TR-02102 ocjenjuje kriptografske postupke; dio 2 obrađuje TLS. Namijenjen je ponajprije razvojnim inženjerima i planerima, a za tijela javne vlasti i regulirana područja često je mjerilo. Server-Side-TLS preporuke, nekad održavane na Mozilla wikiju, danas se nastavljaju pod TLSRef-om i daju konkretne profile koji se mogu kopirati.
TLSRef u verziji 6.0 razlikuje dva profila:
| Obilježje | Intermediate (za većinu web-stranica) | Modern |
|---|---|---|
| Protokoli | TLS 1.2 i TLS 1.3 | samo TLS 1.3 |
| Cipher suites TLS 1.2 | ECDHE s AES-GCM ili ChaCha20-Poly1305 | nema |
| Grupe za razmjenu ključeva | X25519MLKEM768, X25519, prime256v1, secp384r1 | kao Intermediate |
| Certifikat | preporučen ECDSA P-256 ili RSA 2048 bita | ECDSA P-256 |
| Trajanje certifikata | preporučeno 90 dana, najviše 366 dana | 90 dana |
| HSTS max-age | dvije godine | dvije godine |
Za javne web-stranice Intermediate je uobičajeno polazište. Profil isključuje vrlo stare uređaje, ali pokriva aktualne preglednike i operacijske sustave. Hibridna grupa X25519MLKEM768 traži aktualnu TLS biblioteku. Provjerite poznaje li je Vaša verzija OpenSSL-a prije nego je upišete.
Nginx i Apache: siguran polazni položaj
Sljedeći primjeri provode Intermediate profil. Putanje su rezervirana mjesta, a popis cipher suites vrijedi za TLS 1.2; TLS 1.3 donosi vlastite sigurne zadane postupke.
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
Drugi server blok trajno preusmjerava nešifrirane pozive na HTTPS. Preusmjeravanje bi trebalo upućivati izravno na konačnu adresu, a ne ići preko više usputnih postaja. Nakon toga provjerite i ugrađene resurse: slike, skripte ili fontovi koji se još učitavaju preko HTTP-a u pregledniku izazivaju upozorenja ili se blokiraju.
Postavka prema kojoj klijent bira redoslijed odgovara TLSRef preporuci: svi ponuđeni postupci smatraju se sigurnima, a uređaji bez AES ubrzanja tako mogu davati prednost ChaCha20. Nakon svake promjene testirajte konfiguraciju (nginx -t odnosno apachectl configtest) i ponovno učitajte uslugu. Odgovarajuće HSTS zaglavlje i druge preglednikove zadane postavke opisuje vodič Sigurnosna zaglavlja za web-stranice.
Paneli poput Plesk-a ili cPanela često prepisuju vlastite promjene u generiranim datotekama. TLS postavke tamo zadajte preko predviđenih postavki ili predložaka panela.
Certifikati: ključ, lanac, produljenje
Velik dio TLS problema u praksi nema veze s cipher suites, nego s certifikatima. Tipične su pogreške nepotpun lanac u kojem nedostaje međucertifikat, istekli certifikati na sporednim domenama i privatni ključevi sa preširokim pravima datoteka.
Pomažu tri pravila:
- Produljivati automatski i nadzirati produljenje. Kratka trajanja, kakva preporučuje TLSRef, praktična su samo uz automatizaciju.
- Zaštititi privatne ključeve: čitljivi samo za root i proces web-poslužitelja, nikad u webrootu, nikad u repozitoriju.
- Obuhvatiti sva imena: glavnu domenu, www, poddomene za shop, staging, web-sučelje e-pošte i panele.
Tko certifikate koristi na više mjesta, primjerice na CDN-u, load balanceru i izvornom poslužitelju, trebao bi voditi pregled: koji je certifikat gdje instaliran, tko ga produljuje i kada istječe. Bez tog pregleda istekli certifikat često se uoči tek kad se jave kupci.
Kako provjeriti konfiguraciju izvana
Sljedeće naredbe su čiste provjere i ništa ne mijenjaju. Naziv hosta zamijenite svojim:
# TLS 1.3 i TLS 1.2 trebali bi raditi
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 treba propasti
openssl s_client -connect www.example.de:443 -servername www.example.de -tls1_1 </dev/null
# Trajanje i vlasnik isporučenog certifikata
openssl s_client -connect www.example.de:443 -servername www.example.de </dev/null 2>/dev/null | openssl x509 -noout -subject -dates
Neuspjeh pri TLS 1.1 testu može biti i zato što Vaša lokalna verzija OpenSSL-a stari protokol uopće više ne nudi. Za potpuno izvješće o svim ponuđenim postupcima prikladan je specijalizirani TLS skener. Pritom provjerite svaku poddomenu zasebno, jer često rade s vlastitim postavkama.
Zaboravljeno: TLS tamo gdje je PHP sam klijent
PHP aplikacije same uspostavljaju mnoge veze: prema pružateljima plaćanja, dostavnim službama, sučeljima, poslužiteljima e-pošte i bazama podataka. Ovdje najčešća pogreška nije slaba postavka, nego isključena provjera certifikata, često kao brzo rješenje problema u razvoju.
<?php
// Sigurno: certifikat i naziv hosta se provjeravaju (zadržati standardno ponašanje)
$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);
Potražite u kodu CURLOPT_SSL_VERIFYPEER s vrijednošću false i verify_peer u kontekstima streamova. Svako nalazište praktički ukida zaštitu TLS-a za tu vezu. Gdje usluge stoje iza CDN-a, i dionica između CDN-a i izvornog poslužitelja trebala bi koristiti valjan, provjeren certifikat. Dodatne postavke web-poslužitelja za PHP okruženja nalaze se u članku Sigurno konfigurirati Nginx za PHP, a mjerila za cjelokupno ojačavanje u članku CIS Benchmarks i BSI moduli.
Kako PHP SOS konkretno pomaže?
- Bilježimo sve nazive hostova i usluge s TLS-om, uključujući panele, staging i web-sučelja e-pošte.
- Postavke uspoređujemo s TR-02102 i odgovarajućim TLSRef profilom te dokumentiramo svjesna odstupanja.
- Certifikate prebacujemo na automatsko produljenje uz nadzor.
- U aplikacijskom kodu tražimo isključene provjere certifikata i pokazujemo ispravak.
TLS je modul našeg ojačavanja poslužitelja za PHP web-poslužitelje; vezu s aktualnom situacijom objašnjava članak Što je PHP2Shell?.
Česta pitanja
Moram li još nuditi TLS 1.0 i TLS 1.1?
U pravilu ne. Aktualne preporuke, poput Intermediate profila iz TLSRef-a, postavljaju TLS 1.2 kao donju granicu. Tko starije protokole treba za stare uređaje, trebao bi to svjesno odlučiti, dokumentirati i ograničiti na zasebnu uslugu.
Je li besplatan certifikat manje siguran od kupljenog?
Za šifriranje to ne čini razliku. Odlučuju vrsta ključa, duljina ključa, potpun lanac certifikata i pouzdano automatsko produljenje. Razlike postoje u opsegu provjere, trajanju i usluzi pružatelja.
Je li dovoljan HTTPS između posjetitelja i CDN-a?
Ne. I veza između CDN-a i izvornog poslužitelja treba biti šifrirana i provjeravati certifikat izvora. Inače podaci na drugoj dionici putuju mrežom nešifrirani ili neprovjereni.
Kakve veze TLS ima s PHP2Shellom?
Izravno nikakve. TLS štiti podatke na putu prijenosa, a PHP2Shell pogađa PHP interpreter na poslužitelju. Šifrirana veza pouzdano prenosi i napadačke zahtjeve, zato PHP update ostaje obvezan neovisno o tome.