Rozwiązywanie Problemów SSL/TLS - Praktyczny Przewodnik
Problemy z certyfikatami SSL/TLS mogą sparaliżować aplikację w mgnieniu oka. Ten przewodnik pomoże Ci szybko zdiagnozować i naprawić najczęstsze błędy certyfikatów.
Narzędzia Diagnostyczne
OpenSSL - Podstawowe Narzędzie
# Sprawdź certyfikat
openssl s_client -connect example.com:443 -showcerts
# Data wygaśnięcia
echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -dates
# Szczegóły certyfikatu
echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -text
Testssl.sh - Kompleksowa Analiza
# Instalacja
git clone https://github.com/drwetter/testssl.sh.git
cd testssl.sh
# Test
./testssl.sh example.com
Problem 1: Certyfikat Wygasł
Objawy: NET::ERR_CERT_DATE_INVALID
Diagnoza:
openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -dates
Rozwiązanie:
# Let's Encrypt
certbot renew
systemctl reload nginx
# Automatyczne odnowienie
echo "0 3 * * * certbot renew --quiet" | crontab -
Problem 2: Niekompletny Łańcuch Certyfikatów
Objawy: unable to get local issuer certificate
Diagnoza:
openssl s_client -connect example.com:443 -showcerts
# Powinieneś zobaczyć certyfikat + intermediate + root
Rozwiązanie Nginx:
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # fullchain!
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
Ręczne tworzenie fullchain:
cat your-cert.crt intermediate.crt > fullchain.crt
Problem 3: Hostname Mismatch
Objawy: NET::ERR_CERT_COMMON_NAME_INVALID
Diagnoza:
openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -text | grep -A2 "Subject Alternative Name"
Rozwiązanie:
# Dodaj wszystkie domeny do certyfikatu
certbot certonly --nginx -d example.com -d www.example.com -d api.example.com
Problem 4: Mixed Content
Objawy: Mixed Content Warning w konsoli przeglądarki
Diagnoza:
curl -s https://example.com | grep -o 'http://[^"]*'
Rozwiązanie Nginx:
add_header Content-Security-Policy "upgrade-insecure-requests;" always;
Rozwiązanie w kodzie:
<!-- Zamiast http:// użyj // -->
<img src="//example.com/image.jpg">
Problem 5: Self-Signed Certificate
Objawy: NET::ERR_CERT_AUTHORITY_INVALID
Diagnoza:
openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -issuer -subject
# issuer == subject? To self-signed!
Rozwiązanie dla produkcji:
# Zamień na Let's Encrypt
certbot certonly --nginx -d example.com
Problem 6: TLS Version Mismatch
Objawy: ERR_SSL_VERSION_OR_CIPHER_MISMATCH
Diagnoza:
nmap --script ssl-enum-ciphers -p 443 example.com
Rozwiązanie Nginx:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers off;
Problem 7: Port 443 Zablokowany
Objawy: Timeout, connection refused
Diagnoza:
# Test połączenia
telnet example.com 443
nc -zv example.com 443
# Sprawdź firewall
sudo iptables -L -n | grep 443
Rozwiązanie:
# Otwórz port 443
sudo ufw allow 443/tcp
sudo firewall-cmd --permanent --add-service=https
Problem 8: SNI Issues
Objawy: Niewłaściwy certyfikat dla domeny
Diagnoza:
# Test z SNI
openssl s_client -connect example.com:443 -servername example.com
# Test bez SNI
openssl s_client -connect example.com:443 -noservername
Rozwiązanie Nginx:
# Każda domena potrzebuje własnego bloku server
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /path/to/example.com.crt;
ssl_certificate_key /path/to/example.com.key;
}
Problem 9: OCSP Stapling Issues
Diagnoza:
openssl s_client -connect example.com:443 -status 2>/dev/null | grep -A 17 "OCSP response"
Rozwiązanie Nginx:
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /path/to/chain.pem;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 10s;
Problem 10: Certificate Revoked
Objawy: NET::ERR_CERT_REVOKED
Diagnoza:
openssl ocsp -issuer chain.pem -cert cert.pem -url http://ocsp.example.com
Rozwiązanie: Certyfikat został unieważniony - musisz uzyskać nowy:
# Wygeneruj nowy klucz!
openssl genrsa -out new-key.pem 2048
# Uzyskaj nowy certyfikat
certbot certonly --nginx -d example.com --force-renewal
Quick Troubleshooting Checklist
- Data wygaśnięcia - czy certyfikat nie wygasł?
- Łańcuch certyfikatów - czy używasz fullchain?
- Hostname - czy domena jest w SAN?
- Wystawca - czy CA jest zaufany?
- TLS version - czy wspierasz TLS 1.2+?
- Port 443 - czy jest otwarty?
- DNS - czy domena wskazuje na właściwy IP?
- Logi serwera - co mówią error logi?
Narzędzia Online
- SSL Labs: https://www.ssllabs.com/ssltest/ - kompleksowa analiza
- Why No Padlock: https://www.whynopadlock.com/ - debugging mixed content
- SSL Checker: https://www.sslchecker.com/ - szybki test certyfikatu
Monitoring i Prewencja
Najlepszą strategią jest nie dopuszczać do problemów:
# Script monitorujący
#!/bin/bash
DOMAIN="example.com"
DAYS_LEFT=$(echo | openssl s_client -connect $DOMAIN:443 2>/dev/null | openssl x509 -noout -checkend $((30*86400)))
if [ $? -ne 0 ]; then
echo "Certificate expires soon!" | mail -s "SSL Alert" [email protected]
fi
Lub użyj dedykowanego narzędzia jak CrtMgr, które automatycznie monitoruje certyfikaty i wysyła alerty przed wygaśnięciem.
Podsumowanie
Większość problemów z SSL/TLS to:
- Wygasłe certyfikaty (automatyzuj odnowienia!)
- Niekompletny łańcuch (używaj fullchain)
- Hostname mismatch (dodaj wszystkie domeny do SAN)
- Mixed content (CSP: upgrade-insecure-requests)
Z odpowiednimi narzędziami i monitoring większość problemów można wykryć i naprawić w kilka minut.
Dobry troubleshooting = metodyczne podejście + odpowiednie narzędzia