How to Fix ERR_SSL_PROTOCOL_ERROR
ERR_SSL_PROTOCOL_ERROR appears in Chrome and Chromium-based browsers when the TLS handshake fails. It means the browser and server could not agree on a secure connection — either due to a server misconfiguration, an expired/invalid certificate, or a client-side issue.
Important — this error prevents users from accessing your site. If you see it on your own domain, treat it as a P1 incident — resolve it immediately to avoid traffic loss.
Most Common Causes
Step 1 — Diagnose the Certificate
Use OpenSSL to check what certificate your server is presenting:
echo | openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null | openssl x509 -noout -dates -subject -issuer
Check: notAfter is in the future, subject matches your domain, and issuer is a trusted CA.
Step 2 — Check TLS Version Support
Test which TLS versions your server supports:
# Test TLS 1.2 openssl s_client -connect yourdomain.com:443 -tls1_2 2>&1 | grep "Protocol" # Test TLS 1.3 openssl s_client -connect yourdomain.com:443 -tls1_3 2>&1 | grep "Protocol"
If TLS 1.2 and 1.3 both fail, your server configuration is the issue. Update your web server config:
# Nginx
ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off;
# Apache
SSLProtocol -all +TLSv1.2 +TLSv1.3 SSLCipherSuite TLSv1.3 TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
Step 3 — Fix the Certificate Chain
An incomplete chain means your server isn't sending intermediate certificates. Build the full chain:
# Combine your certificate + intermediate CA(s) into one file cat your_domain.crt intermediate.crt root.crt > fullchain.pem
In Nginx, point ssl_certificate to fullchain.pem. Let's Encrypt includes this by default.
Client-Side Fixes (Visitor's Browser)
Use our free SSL Certificate Checker to diagnose certificate and TLS issues on any domain — including expired certificates, weak TLS versions, and chain errors.