KernelRanch
返回文章列表

SSL/TLS 模式:Flexible、Full、Full (strict) 怎么选

2026-11-10 #Cloudflare

边缘证书只解决"用户到 Cloudflare"这一段。用户浏览器与 Cloudflare 之间是 HTTPS,不代表 Cloudflare 到你的源站也是 HTTPS——这一段由 SSL/TLS 模式决定。免费计划里四种模式都能选,选错的表现从"看不到锁"到"重定向循环"到"526 证书无效",大多能追到这一个设置上。

这篇把四种模式的差别、各自的失败表现、以及切换到 Full (strict) 需要的准备讲清楚。证书本身的签发与续期见 51-free-https-edge-certificate.md。

前置:域名走代理(橙色云),否则流量不经过边缘,这个设置不生效。DNS 记录与代理状态见 50-dns-records-tutorial.md。

1. 四种模式

模式用户 ↔ 边缘边缘 ↔ 源站源站证书校验
OffHTTPHTTP无
FlexibleHTTPSHTTP无
FullHTTPSHTTPS不校验证书有效性
Full (strict)HTTPSHTTPS校验有效期、主机名、签发机构

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. 切换顺序

  1. 源站装好证书,确认 443 端口在监听、防火墙放行。
  2. 控制台 SSL/TLS → Overview,模式改为 Full (strict)。
  3. 打开 Always Use HTTPS,把 http:// 请求 301 到 https://。
  4. 打开 Automatic HTTPS Rewrites,让页面里的 http:// 资源自动改写。
  5. Minimum TLS Version 设为 1.2,TLS 1.3 保持开启。
  6. 用 curl 验证:curl -sI https://example.com | head -3 看到 200 或 301 即可。

顺序不能反。先开 Always Use HTTPS、源站还没证书时把模式设成 Full,会立刻全站 526;先改模式再装证书同样如此。切换放在低峰期,改完立刻用无痕窗口访问一次。

4. 报错对照

报错含义先查什么
525SSL 握手失败源站 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 的可选值以控制台为准,文中只给建议下限。