ERR_SSL_PROTOCOL_ERROR: bezpieczne połączenie zawodzi przed certyfikatem
· 5 min czytania
Co oznacza ten błąd
Przeglądarka połączyła się z portem 443 i zaczęła negocjować szyfrowanie (TLS), ale rozmowa się urwała: serwer odpowiedział czymś, co nie jest TLS, nie zgodził się na żadną wersję protokołu ani szyfr, albo coś po drodze zepsuło pakiety. Chrome pokazuje ERR_SSL_PROTOCOL_ERROR („Ta witryna nie może zapewnić bezpiecznego połączenia”), Firefox SSL_ERROR_RX_RECORD_TOO_LONG albo SSL_ERROR_NO_CYPHER_OVERLAP.
To coś innego niż „Połączenie nie jest prywatne”: tam uścisk dłoni się udał, a przeglądarka odrzuciła certyfikat. Tu do certyfikatu w ogóle nie doszło. Serwer działa i port jest otwarty, inaczej byłoby ERR_CONNECTION_REFUSED.
Częste przyczyny
- Serwer mówi HTTP na porcie 443. W bloku
listen 443brakujessl, albo aplikacja (Node.js, panel) nasłuchuje bez TLS, a przeglądarka dostaje zwykły tekst zamiast TLS. Najczęstsza przyczyna po ręcznej konfiguracji. - Tylko stare wersje TLS. Serwer oferuje wyłącznie TLS 1.0/1.1 albo SSLv3; nowoczesne przeglądarki ich nie akceptują.
- Brak wspólnego szyfru. Lista
ssl_ciphersograniczona do algorytmów, których przeglądarka nie obsługuje, albo certyfikat ECDSA ze zbyt starą biblioteką. - Uszkodzony albo niepasujący klucz prywatny. Certyfikat i klucz z różnych par; nginx startuje, ale uścisk dłoni zawodzi.
- Proxy, CDN albo load balancer z własną, zepsutą konfiguracją TLS; w Cloudflare zły tryb SSL albo wyłączone TLS 1.3 przy serwerze, który wymaga 1.3.
- Antywirus albo firewall odwiedzającego, który „skanuje HTTPS” i podmienia pakiety, VPN z filtrowaniem, stary system bez obsługi TLS 1.2.
- QUIC/HTTP3 albo stan w przeglądarce: stary wpis w pamięci podręcznej TLS, uszkodzony profil.
Jeśli odwiedzasz cudzą stronę
- Wyczyść stan SSL przeglądarki: Chrome
chrome://net-internals/#sockets→ „Flush socket pools”, Windows dodatkowo „Wyczyść stan SSL” w opcjach internetowych. - Wyłącz na chwilę skanowanie HTTPS w antywirusie i VPN.
- Sprawdź datę i godzinę na komputerze.
- Spróbuj w oknie prywatnym i w innej przeglądarce. Jeśli wszędzie zawodzi, a narzędzie SSL checker też nie może nawiązać połączenia, winny jest serwer.
Jeśli to Twoja strona: najpierw sprawdź
SSL checker pokaże „nie udało się nawiązać bezpiecznego połączenia” zamiast danych certyfikatu; to już odróżnia protokół od wygasłego certyfikatu. Potem z własnego komputera:
# co odpowiada port 443?
curl -vI https://przyklad.pl 2>&1 | grep -iE 'ssl|tls|error'
# pełny uścisk dłoni, z wersjami i szyfrem
echo | openssl s_client -connect przyklad.pl:443 -servername przyklad.pl 2>&1 | grep -E 'Protocol|Cipher|error|verify'
# czy serwer akceptuje TLS 1.2 i 1.3?
echo | openssl s_client -connect przyklad.pl:443 -tls1_2 2>&1 | grep -E 'Protocol|error'
echo | openssl s_client -connect przyklad.pl:443 -tls1_3 2>&1 | grep -E 'Protocol|error'
wrong version number oznacza HTTP na porcie 443 (przyczyna 1). no protocols available albo handshake failure to wersje lub szyfry (2, 3). curl z SSL_ERROR_SYSCALL w środku uścisku dłoni wskazuje proxy lub firewall.
Na serwerze:
sudo nginx -T | grep -nE 'listen|ssl_protocols|ssl_ciphers|ssl_certificate'
sudo apachectl -S
sudo journalctl -u nginx -n 30 --no-pager
Naprawy na własnym serwerze
1. Włącz TLS na porcie 443
W bloku server nginx:
listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate /etc/letsencrypt/live/przyklad.pl/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/przyklad.pl/privkey.pem;
Bez słowa ssl nginx obsługuje na 443 zwykłe HTTP. W Apache sprawdź, czy SSLEngine on jest w <VirtualHost *:443> i czy moduł jest włączony: sudo a2enmod ssl. Aplikacja bez TLS (np. Node.js na 3000) powinna stać za nginx, nie bezpośrednio na 443.
2. Nowoczesne wersje i szyfry
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;
Apache: SSLProtocol -all +TLSv1.2 +TLSv1.3 i analogiczne SSLCipherSuite. Potem test i przeładowanie:
sudo nginx -t && sudo systemctl reload nginx
sudo apachectl configtest && sudo systemctl reload apache2
3. Sprawdź parę certyfikat–klucz
openssl x509 -noout -pubkey -in fullchain.pem | openssl md5
openssl pkey -pubout -in privkey.pem | openssl md5
Dwa różne skróty oznaczają niepasującą parę. Wystaw certyfikat ponownie (sudo certbot renew --force-renewal) albo przywróć właściwy klucz z kopii zapasowej.
4. Proxy i Cloudflare
W Cloudflare ustaw tryb SSL „Full (strict)” i sprawdź, czy serwer źródłowy ma ważny certyfikat; „Flexible” z serwerem, który przekierowuje na HTTPS, tworzy pętlę (ERR_TOO_MANY_REDIRECTS). Przy własnym load balancerze (HAProxy, Traefik) sprawdź, czy TLS jest zakończone w jednym miejscu, nie w dwóch, i czy backend mówi tym protokołem, którego balancer oczekuje.
5. Port 443 zajęty przez inną usługę
sudo ss -tlnp | grep ':443'
Jeśli na 443 siedzi inny program niż serwer WWW (panel, VPN, stary proces), przeglądarka rozmawia z nim. Zatrzymaj go albo przenieś na inny port.
Gdy to problem dostawcy hostingu
Na hostingu współdzielonym konfigurację TLS trzyma dostawca. Wyślij:
Dzień dobry, od około 15:10 UTC przeglądarki pokazują ERR_SSL_PROTOCOL_ERROR dla mojej strony przyklad.pl; openssl zgłasza „wrong version number” (albo „handshake failure”) na porcie 443. Certyfikat w panelu jest ważny, po mojej stronie nic się nie zmieniło. Czy mogliby Państwo sprawdzić konfigurację SSL/TLS serwera dla mojej domeny i wersje protokołu?
Jak zapobiec następnemu
Błąd protokołu pojawia się po zmianie konfiguracji, aktualizacji serwera WWW albo zmianie u pośrednika, i od razu widzi go każdy odwiedzający. Sprawdzanie HTTPS w monitoringu stron zauważa nieudany uścisk dłoni w ciągu minuty, a monitoring certyfikatów SSL pilnuje łańcucha, nazwy i daty wygaśnięcia. Awaria? Naprawiamy: Quick Fix poprawia drobne błędy konfiguracji po teście i przeładowuje serwer WWW w stałej cenie; wersje TLS, szyfry, proxy i niepasujące klucze porządkuje Deep Fix, przez całą dobę. Zobacz naprawa serwera.
Co teraz
Sprawdź certyfikat
Data wygaśnięcia, łańcuch i nazwa hosta dowolnego certyfikatu w kilka sekund. Za darmo, bez rejestracji.
SSL checkerAwaria? Naprawiamy.
Na Twoim własnym serwerze albo na hostingu z dostępem SSH: Quick Fix w stałej cenie na częste przyczyny, Deep Fix rozliczany w blokach po 15 minut na resztę, przez całą dobę. Cena przed zamówieniem.
Zamów naprawęWięcej poradników
- Strona nie działa: co zrobić w pierwszych 15 minutach
- Awaria serwera: co sprawdzić i w jakiej kolejności
- Błąd 500 Internal Server Error: znajdź przyczynę w logach i przywróć stronę
- Błąd 502 Bad Gateway: znajdź przyczynę i napraw
- Błąd 503: przeciążenie, konserwacja czy limit hostingu?
- Błąd 504 Gateway Timeout: znajdź, co spowalnia stronę
- Błąd 521 i 522 w Cloudflare: serwer źródłowy nie odpowiada
- DNS_PROBE_FINISHED_NXDOMAIN: domena przestała odpowiadać
- ERR_CONNECTION_REFUSED: serwer odrzuca połączenie
- ERR_CONNECTION_TIMED_OUT: serwer nie odpowiada na czas
- Co oznacza „Połączenie nie jest prywatne” i jak to naprawić
- ERR_TOO_MANY_REDIRECTS: znajdź pętlę przekierowań i ją przerwij
- Błąd 403 Forbidden: co blokuje dostęp do Twojej strony
- ERR_NAME_NOT_RESOLVED: nie można znaleźć nazwy strony
- „Błąd podczas nawiązywania połączenia z bazą danych” w WordPressie: przyczyna i naprawa
- ERR_CONNECTION_RESET: dlaczego połączenie zrywa się w połowie
- Błąd 429 Too Many Requests: który limit blokuje odwiedzających
- ERR_EMPTY_RESPONSE: serwer nie wysłał żadnych danych
- Błąd krytyczny WordPress: znajdź przyczynę i przywróć stronę