Rozwiązywanie Problemów SSL/TLS - Praktyczny Przewodnik
Pół godziny do prezentacji dla klienta. Odświeżasz stronę demonstracyjną i widzisz wielki czerwony ekran: “Twoje połączenie nie jest prywatne”. Serce staje. Znasz ten stan? Problemy z certyfikatami SSL/TLS potrafią zaskoczyć w najbardziej nieodpowiednim momencie - ale większość z nich ma proste rozwiązanie, jeśli wiesz, gdzie szukać.
Narzędzia Diagnostyczne
Zanim zaczniesz właściwy troubleshooting, upewnij się że masz pod ręką openssl - to twój najlepszy przyjaciel w diagnostyce SSL. Większość problemów da się zdiagnozować w kilka minut.
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 -
Wygasłe certyfikaty to najczęstszy problem - i jednocześnie najłatwiejszy do uniknięcia. Jeśli jeszcze nie masz monitoringu certyfikatów, koniecznie sprawdź jak skonfigurować SSL na Nginx z automatycznym odnawianiem.
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
Gdy ręczne metody nie wystarczają, warto sięgnąć po bardziej kompleksowy monitoring. Sprawdź nasz artykuł o monitoringu certyfikatów z Prometheus i Grafana - tam znajdziesz jak ustawić alerty, które uprzedzą cię o problemach zanim zauważą je użytkownicy.
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
- test SSL Labs Server Test - kompleksowa analiza
- narzędzie Why No Padlock? - debugging mixed content
- narzędzie SSL Checker - 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" admin@example.com
fi
Lub użyj dedykowanego narzędzia jak CrtMgr, które automatycznie monitoruje certyfikaty i wysyła alerty przed wygaśnięciem.
Dobre podejście do troubleshootingu SSL to przede wszystkim metodyczność - nie panikuj, idź punkt po punkcie przez checklistę. Większość problemów to wygasłe certyfikaty (automatyzuj odnawianie!), niekompletny łańcuch (zawsze używaj fullchain) lub hostname mismatch (dodaj wszystkie domeny do SAN). Mając odpowiednie narzędzia, naprawa zajmuje kilka minut - nie godzin. A żeby uniknąć problemów w przyszłości, użyj CrtMgr do automatycznego monitoringu i alertów przed wygaśnięciem.