TLS/SSL — Šifrovanie a certifikáty
TLS (Transport Layer Security) zabezpečuje komunikáciu na internete. Keď vidíš HTTPS, znamená to, že spojenie je šifrované cez TLS. SSL je starší predchodca — dnes sa používa výlučne TLS, ale názov SSL prežíva v bežnej reči.
Ako funguje TLS?
TLS handshake prebieha pri každom novom spojení:
- Client Hello — klient pošle podporované cipher suites a TLS verziu
- Server Hello — server vyberie cipher suite a pošle svoj certifikát
- Overenie certifikátu — klient overí reťaz dôvery (certificate chain)
- Key exchange — dohodnutie symetrického kľúča (ECDHE)
- Šifrovaná komunikácia — všetky dáta sú šifrované
TLS 1.3 zjednodušil handshake na 1-RTT (jedno roundtrip), čím sa výrazne zrýchlil.
Certificate Chain
Certifikáty tvoria reťaz dôvery:
Root CA (v prehliadači/OS)
└── Intermediate CA
└── Server certifikát (tvoja doména)
# Overenie certifikátu
openssl s_client -connect example.com:443 -showcerts
# Zobrazenie detailov certifikátu
openssl x509 -in cert.pem -text -noout
# Overenie expirácie
openssl x509 -in cert.pem -enddate -noout
echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -dates
Let's Encrypt — Bezplatné certifikáty
Let's Encrypt demokratizoval HTTPS. Certbot je najpoužívanejší klient:
# Inštalácia certbotu
apt install certbot python3-certbot-nginx
# Získanie certifikátu pre Nginx
certbot --nginx -d example.com -d www.example.com
# Len certifikát (bez konfigurácie webservera)
certbot certonly --standalone -d example.com
# Wildcard certifikát (vyžaduje DNS challenge)
certbot certonly --dns-cloudflare -d "*.example.com" -d example.com
# Automatická obnova (certbot timer)
certbot renew --dry-run
systemctl enable certbot.timer
mTLS — Obojstranná autentifikácia
Štandardný TLS overuje len server. mTLS (mutual TLS) overuje aj klienta — bežné v microservices a zero-trust architektúrach:
# Generovanie klientského certifikátu
openssl req -newkey rsa:2048 -nodes -keyout client.key -out client.csr
openssl x509 -req -in client.csr -CA ca.pem -CAkey ca-key.pem -out client.pem
# Nginx konfigurácia pre mTLS
# ssl_client_certificate /etc/nginx/ca.pem;
# ssl_verify_client on;
# Testovanie s curl
curl --cert client.pem --key client.key https://api.example.com
HSTS — Vynútenie HTTPS
HSTS (HTTP Strict Transport Security) hovorí prehliadaču, aby vždy používal HTTPS:
# Nginx header
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
- max-age — ako dlho si prehliadač pamätá (31536000 = 1 rok)
- includeSubDomains — platí aj pre subdomény
- preload — zaradenie do preload listu prehliadačov (hstspreload.org)
Best Practices
- Len TLS 1.2+ — zakáž TLS 1.0 a 1.1, ideálne len TLS 1.3
- Automatická obnova certifikátov — Let's Encrypt expiruje za 90 dní
- HSTS preload — po dôkladnom testovaní aktivuj preload
- CAA záznamy v DNS — obmedz, kto môže vydať certifikát pre tvoju doménu
- Monitoruj expiráciu — alerting 14+ dní pred expriáciou
- Silné cipher suites — ECDHE + AES-GCM, žiadne CBC alebo RSA key exchange
- OCSP stapling — rýchlejšie overenie certifikátu
TLS nie je voliteľný — je povinný. Každá služba vystavená do internetu musí byť šifrovaná.