在做网站加速优化时,很多朋友都会选择“海内外分流”的架构:国外走 Cloudflare,国内走华为云、DOKICDN 等加速节点。这种方案确实能兼顾访问速度和隐私,但随之而来的 SSL/TLS 证书配置问题,往往让人头秃——尤其是当你发现 Cloudflare 的证书似乎“下不来”的时候。

最近看到有小伙伴在折腾这套架构时遇到典型困惑:A 域名(前台)、B 域名(海外回源)、C 域名(国内 CNAME)都已经解析好了,结果卡在了“证书到底该用谁的”这一步。

核心误区:证书不是只有一张

首先要明确一个概念:在全站 HTTPS 链路中,每一跳都需要证书,且证书可以是完全不同的。

架构示意图

海内外分流的 HTTPS 链路结构

在这个分流架构里,我们实际上面对的是三条链路:

  1. 用户 -> 国内 CDN (C域名/DOKICDN)
  2. 用户 -> Cloudflare (A域名)
  3. CDN 节点 -> 源站 (B域名)

很多朋友困惑的点在于:“Cloudflare 不是全自动签发证书吗?为什么还要自己申请?”

答案是:Cloudflare 自动签发并管理的是“用户 <-> Cloudflare”这一段 edge 证书。 它确实非常方便,你可以开启“Flexible”模式让源站只用 HTTP,或者开启“Full”模式让源站自签证书。但是,当你希望引入第三方国内 CDN(如 DOKICDN)时,事情就变得复杂了。

你需要的不是下载 Cloudflare 证书

很多教程会尝试教你如何从 Cloudflare 导出 Origin Certificate(源证书)并上传到国内 CDN。但这通常是死胡同,原因有二:

  1. Cloudflare 的 Origin Certificate 默认不被公共信任:它是给 Cloudflare 和你的源站之间用的,浏览器不认。如果你把它部署给国内 CDN 用,国内 CDN 作为“客户端”去验证时可能会报错,或者它无法直接展示给最终用户看。
  2. 国内 CDN(如 DOKICDN)通常需要公网可信证书:为了对最终用户提供 HTTPS 服务,国内 CDN 节点必须持有由 Let's Encrypt、DigiCert 等受信 CA 签发的证书。

正确的解法:双证书策略

其实,海内外访问使用不同的域名证书是完全正确的,也是必须的。 我们不需要让 Cloudflare 的证书和国内 CDN 的证书保持一致,只要它们各自信任即可。

场景一:国内 CDN (C域名) 的证书怎么办?

国内 CDN 厂商通常支持两种证书配置方式:

  • 托管证书:很多厂商(如 DOKICDN、腾讯云等)如果支持 CNAME 接入,往往提供内置的 Let's Encrypt 自动签发功能。你在后台勾选“开启 HTTPS”,系统会自动验证域名所有权并签发证书。这是最省事的。
  • 手动上传:如果你需要自定义证书,你需要自己去申请一张 C域名 的公网可信证书(推荐使用 acme.sh 等工具申请 ZeroSSL 或 Let's Encrypt),然后下载下来粘贴到国内 CDN 的后台。

场景二:海外回源 (B域名) 的证书怎么办?

B 域名是 Cloudflare 回源用的,或者是你的服务器真实 IP 对应的域名。

  • 如果你使用 Cloudflare 的 Full (Strict) 模式,或者 Cloudflare 只是作为其中一环,你需要保证 Cloudflare 访问你的源站时,源站提供的证书是有效的。这里可以直接用 Cloudflare 的 Origin Certificate(15年有效期,仅限 CF 使用),部署在你的源站 Nginx/Caddy 上。
  • 如果你担心 Cloudflare Origin Certificate 兼容性问题,直接给 B 域名申请一张 Let's Encrypt 证书并在源站部署也是完全 OK 的。

终极痛点:ACME 验证报错 403 怎么破?

回到提问中提到的坑:使用 acme.sh 自动申请证书时,提示 403 :: unauthorized :: Invalid response from

这是因为你的 DNS 解析已经指向了 CDN(或 Cloudflare)的 IP,而 Let's Encrypt 的验证服务器去访问你的域名验证文件时,被 CDN 或 WAF 拦截了,或者根本找不到源站。

解决方案有三种:

  1. DNS API 验证(推荐):这是最稳妥的方法。不要用 HTTP 方式验证,改用 DNS API 方式(如 Cloudflare API 或阿里云 API)。acme.sh 会直接在你的 DNS 服务商添加一条 TXT 记录来完成验证,完全不需要开启 80 端口,也不受 CDN 防护影响。

    # 示例命令
    export CF_Token="你的_API_Token"
    acme.sh --issue --dns dns_cf -d your-domain.com
    
  2. Cloudflare Worker 代理(如果你非要用 HTTP 验证):提问中提到的“用 Worker 处理 http 验证端点”思路是对的。你可以写一个简单的 Worker,当访问 /.well-known/acme-challenge/xxx 时,直接返回验证 token。但这比 DNS API 麻烦得多,且容易出错。

  3. 临时关闭 CDN:在申请证书的瞬间,把域名的 DNS 解析暂时改回源站 IP,验证通过后再改回 CDN。这种方式适合运维窗口期,不适合自动化。

总结一下这套架构的配置清单

如果你正在搭建这套“国内外分流”方案,按下面的步骤自查:

  1. A域名(前台):Cloudflare 提供 Edge SSL 证书(全自动,无需操心)。
  2. C域名(国内接入):去国内 CDN 后台开启“HTTPS 托管”,或者用 acme.sh + DNS API 手动申请一张 C域名的证书并上传。
  3. B域名(源站):部署一张 Cloudflare Origin Certificate 或者普通的 Let's Encrypt 证书供 CDN 回源验证使用。
  4. 不要强求统一:A、B、C 三个域名的证书互不相同,链路分段加密,安全又合规。

搞定这几个环节,你的网站就能在国内外都实现加密高速访问了,再也不用看着那一堆证书问号发呆。

标签: none

AI Skills Smart Station on Nick Launches

评论已关闭