SSL/TLS 模式:Flexible、Full、Full (strict) 怎么选
边缘证书只解决"用户到 Cloudflare"这一段。用户浏览器与 Cloudflare 之间是 HTTPS,不代表 Cloudflare 到你的源站也是 HTTPS——这一段由 SSL/TLS 模式决定。免费计划里四种模式都能选,选错的表现从"看不到锁"到"重定向循环"到"526 证书无效",大多能追到这一个设置上。
这篇把四种模式的差别、各自的失败表现、以及切换到 Full (strict) 需要的准备讲清楚。证书本身的签发与续期见 51-free-https-edge-certificate.md。
前置:域名走代理(橙色云),否则流量不经过边缘,这个设置不生效。DNS 记录与代理状态见 50-dns-records-tutorial.md。
1. 四种模式
| 模式 | 用户 ↔ 边缘 | 边缘 ↔ 源站 | 源站证书校验 |
|---|---|---|---|
| Off | HTTP | HTTP | 无 |
| Flexible | HTTPS | HTTP | 无 |
| Full | HTTPS | HTTPS | 不校验证书有效性 |
| Full (strict) | HTTPS | HTTPS | 校验有效期、主机名、签发机构 |
Off 等于关掉 HTTPS,免费计划的 Universal SSL 也救不了,只有排查问题时临时用。
Flexible 是"半程加密":用户那一段有锁,Cloudflare 到源站是明文。同一个机房内的流量、跨公网的流量都在明文里走,源站日志里看到的也是 http://。它能跑通,但只在源站确实没有证书、又急着上线时用。
Full 会走 HTTPS,但不检查源站证书是否有效。自签证书、过期证书、主机名不对的证书都能握上手。它比 Flexible 好,因为链路上是加密的;风险在于你对"对面是谁"没有验证,中间人换了证书也发现不了。
Full (strict) 是正确选项:源站证书要在有效期内、主机名匹配、由公共 CA 或 Cloudflare Origin CA 签发。
2. 换到 Full (strict) 需要什么
源站上要有一张能被信任的证书。两条路:
第一条是 Let's Encrypt 或其它公共 CA,用 certbot 之类工具签发并自动续期。优点是通用,缺点是续期要维护。
第二条是 Cloudflare Origin CA 证书,控制台 SSL/TLS → Origin Server → Create Certificate 生成。它的有效期可以选 15 年,由 Cloudflare 自己的 CA 签发,只有走 Cloudflare 代理时才有意义(浏览器不信任这个 CA)。源站是 Nginx / Caddy 时直接装上去即可。
生成时要把源站使用的主机名填全,包括 example.com 与 *.example.com。主机名不匹配会直接跳到 526。
装好之后先在源站本地验证,再改模式:
# 源站本机验证证书链与主机名
openssl s_client -connect 127.0.0.1:443 -servername example.com </dev/null 2>/dev/null \
| openssl x509 -noout -subject -issuer -dates
能看到 subject=CN=example.com、有效期覆盖当前时间,再进行下一步。
3. 切换顺序
- 源站装好证书,确认 443 端口在监听、防火墙放行。
- 控制台 SSL/TLS → Overview,模式改为 Full (strict)。
- 打开 Always Use HTTPS,把
http://请求 301 到https://。 - 打开 Automatic HTTPS Rewrites,让页面里的
http://资源自动改写。 - Minimum TLS Version 设为 1.2,TLS 1.3 保持开启。
- 用 curl 验证:
curl -sI https://example.com | head -3看到 200 或 301 即可。
顺序不能反。先开 Always Use HTTPS、源站还没证书时把模式设成 Full,会立刻全站 526;先改模式再装证书同样如此。切换放在低峰期,改完立刻用无痕窗口访问一次。
4. 报错对照
| 报错 | 含义 | 先查什么 |
|---|---|---|
| 525 | SSL 握手失败 | 源站 443 是否在听、协议版本是否被禁用 |
| 526 | 源站证书无效 | 证书是否过期、主机名是否匹配、是否自签 |
| 520 | 源站返回未知内容 | 源站应用崩溃或返回空响应 |
| 521 | 源站拒绝连接 | 源站服务没起、端口没开 |
| 522 | 连接超时 | 防火墙丢包、源站负载过高 |
| 523 | 源站不可达 | DNS 或路由问题 |
| 524 | 连接建立但响应超时 | 应用处理超过 100 秒 |
525 与 526 是模式切换时最常见的两个。525 通常是源站只开了 80 端口,或者 Nginx 只监听了 IPv4 而 Cloudflare 走 IPv6;526 多半是证书过期或漏了通配符。
Flexible 模式下最常见的故障是重定向循环:源站配置了"HTTP 跳 HTTPS",而 Cloudflare 送到源站的是 HTTP,源站回 301 到 HTTPS,Cloudflare 再以 HTTP 回源,转圈到浏览器报 ERR_TOO_MANY_REDIRECTS。两种解法:源站对来自 Cloudflare 的请求不再跳转(按 CF-Connecting-IP 或内网网段判断),或者干脆换成 Full (strict)。
5. 边缘侧的三个开关
Always Use HTTPS:把 HTTP 请求 301 到 HTTPS。开了之后 HSTS 才有意义。
Automatic HTTPS Rewrites:把 HTML 里的 http:// 链接改写成 https://,减少混合内容。它不处理 JS 里动态拼接的 URL。
HSTS:通过 Strict-Transport-Security 头告诉浏览器以后只用 HTTPS。它一旦被浏览器记住,在 max-age 内无法回退到 HTTP,所以先确认全站(含子域)都能 HTTPS 再开。配置细节见 83-security-headers-hsts.md。
Minimum TLS Version 设 1.2 是当前合理的下限。仍有大量老旧设备只支持 TLS 1.0/1.1,如果你的用户里有工业设备、老安卓机,先看 Analytics 里的 TLS 版本分布再决定。
常见问题
只改了模式没装证书,现在全站 526,怎么回滚?
把模式改回 Full 或 Flexible,站点立刻恢复。恢复后再按"源站装证书 → 本地 openssl 验证 → 改模式"的顺序重来。改配置前记下原值,回滚只需要一次点击。
免费计划能用 Origin CA 证书吗?
能。Origin CA 证书的生成入口对所有套餐开放,它与付费无关,只与"源站是否走 Cloudflare 代理"有关。
为什么浏览器显示证书是 Cloudflare 签发的,而不是我的?
用户看到的是边缘证书(Universal SSL),由公共 CA 签发,与源站证书是两回事。origin 证书只在 Cloudflare 到源站这一段使用,浏览器看不到。
小结
四种模式里只有一个值得长期使用:Full (strict)。它要求源站有一张有效、主机名匹配的证书,成本是一张免费证书加十几分钟配置,换来的是全程加密与对源站身份的校验。
Flexible 能用但不要用。它的"半程明文"不是理论风险,源站日志、内网链路、跨机房流量都会暴露。真要临时用它上线,把"换成 Full (strict)"写进待办,别让它变成长期状态。
数据来源与检索时间
检索时间 2026-11-10。
| 来源 | URL | 对应数据 |
|---|---|---|
| Cloudflare 定价页 | https://www.cloudflare.com/plans/ | 免费计划包含 Universal SSL 与 SSL/TLS 模式设置 |
| 边缘证书文档 | https://developers.cloudflare.com/ssl/ | 边缘证书与源站证书的分工、Origin CA 的用途 |
| DNS 记录文档 | https://developers.cloudflare.com/dns/manage-dns-records/how-to/create-dns-records/ | 代理状态(橙色云)与边缘 TLS 的关系 |
核验说明
- 页面为本机抓取(HTTP 200),四种模式的定义与校验条件取自文档描述。
- 未执行:无 Zone 权限,SSL/TLS 模式未切换,Origin CA 证书未生成,525/526 与重定向循环未在真实站点复现;报错对照表依据公开文档与常见故障整理。
- 未验证:
openssl s_client命令片段未对真实源站执行;Minimum TLS Version 的可选值以控制台为准,文中只给建议下限。