Cloudflare 525 SSL Handshake Failed:原因排查与修复方法

Cloudflare 525 错误发生在 Cloudflare 与源站之间,不是用户与 Cloudflare 之间。含义:Cloudflare 已经接收到请求,但无法与源站完成 TLS 握手。

快速检测源站 TLS

openssl s_client -connect 源站IP:443 -servername 你的域名

正常握手会看到:

New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384

如果出现 handshake failure,问题在 Nginx 或证书配置。

原因一:Nginx 未使用 fullchain 证书(最常见)

Let’s Encrypt 证书必须用 fullchain.pem,不能只用叶证书:

# 正确
ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

检查:

nginx -T | grep ssl_certificate

如果配置的是 cert.pem 而非 fullchain.pem,Cloudflare 会因为证书链不完整而报 525。

openssl 验证时看到这行也是同一问题:

verify error:num=20:unable to get local issuer certificate

原因二:TLS 版本过低

Cloudflare 要求至少 TLS 1.2。Nginx 配置:

ssl_protocols TLSv1.2 TLSv1.3;

原因三:Cipher Suite 过于严格

ssl_ciphers HIGH:!aNULL:!MD5;

检查源站支持的 cipher:

nmap --script ssl-enum-ciphers -p 443 源站IP

原因四:开启了客户端证书验证

ssl_verify_client on;

Cloudflare 无法提供匹配的客户端证书,直接导致 525。

检查:

nginx -T | grep verify_client

原因五:443 端口未监听

telnet 源站IP 443

或:

curl -vk https://源站IP

如果 Connection refused 说明 Nginx 没有监听 443。

原因六:IPv6 配置问题

Cloudflare 可能优先走 IPv6:

dig AAAA 你的域名

如果有 AAAA 记录,但 Nginx 的 IPv6 监听或防火墙有问题:

openssl s_client -connect [IPv6地址]:443 -servername 你的域名

测试是否成功。

Cloudflare SSL 模式

Cloudflare Dashboard → SSL/TLS → Overview 查看当前模式:

模式要求
Flexible源站无需 HTTPS
Full源站需要 HTTPS,证书可自签
Full (strict)源站需要有效证书,证书链完整

使用 Full (strict) 时,源站必须配置 fullchain.pem

完整排查步骤

# 1. 检查证书配置
nginx -T | grep ssl_certificate

# 2. 测试握手(替换为实际源站 IP)
openssl s_client -connect 源站IP:443 -servername 你的域名

# 3. 检查 IPv6
dig AAAA 你的域名

# 4. 检查客户端验证
nginx -T | grep verify_client

# 5. 直接用 curl 测试
curl -Iv https://你的域名