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://你的域名