# Cloudflare Origin CA 源站证书安装与 Full (strict) 模式

> 创建免费的 Cloudflare Origin CA 源站证书，安装到 Nginx，把 SSL/TLS 加密模式切到 Full (strict)，可选开启 Authenticated Origin Pulls，并说明中国网络的限制。

Source: https://ssl.sh/zh/guides/cloudflare-origin-certificate/
Last updated: 2026-11-10

在 Cloudflare 控制台创建免费的 Origin CA 证书，装到源站 Nginx 上，再把 SSL/TLS 加密模式切到 Full (strict)，Cloudflare 到源站这一段就会加密并校验证书。访客看到的仍是 Cloudflare 的边缘证书。

适用于截至 2026 年 11 月的所有 Cloudflare 套餐和 Nginx 源站，同样的证书文件也能用在 Apache 等服务器上。控制台菜单名按英文界面写，中文界面里是对应的译名。

## 两段连接、两张证书

访客到 Cloudflare 是一段，Cloudflare 到源站是另一段，Origin CA 证书只管后一段。

访客浏览器看到的是 Cloudflare 边缘节点上的证书（Universal SSL 等），由 Cloudflare 签发和续期，你不用管。Cloudflare 再去连你的源站时，源站要出示一张证书；如果这段不加密或者不校验，中间链路上的人就能看到或篡改流量。Origin CA 证书就是为这一段准备的：免费、有效期长，但只有 Cloudflare 信任它。

国内用户常见的场景是源站放在海外 VPS 上、前面套 Cloudflare。这种用法适合 Origin CA，但有两点限制：

- **中国网络是另一回事**：Cloudflare 在中国大陆的数据中心由合作伙伴京东云运营，叫中国网络（China Network），只作为企业版的单独订阅提供，而且并非所有产品都能用。每个根域名都要有有效的 ICP 备案（非经营性网站）或 ICP 许可证（经营性网站），备案号要显示在网页底部，域名还必须支持 IPv6。官方的可用产品列表里列出了边缘证书和 Authenticated Origin Pulls，但没有单独提到 Origin CA，企业客户请以 Cloudflare 的说明为准。
- **源站在国内的同样要备案**：所有在中国大陆运行的网站都需要 ICP 备案，前面套了 Cloudflare 并不改变这一点。国内云厂商可能在不另行通知的情况下关停没有备案的网站。

## 前提条件

域名必须已经接入 Cloudflare 代理。

- 域名在 Cloudflare 上处于活跃状态，`example.com` 和 `www.example.com` 的 `A`/`AAAA` 记录已开启代理（橙色云朵），指向源站，例如 `203.0.113.10`。
- 源站运行 Nginx，443 端口允许 Cloudflare 访问。
- 能登录这个域名的 Cloudflare 控制台。

## 第一步：创建 Origin CA 证书

Origin CA 证书在 Cloudflare 控制台里创建，有效期最长 15 年。进入 **SSL/TLS → Origin Server → Create Certificate**，选择 Generate private key and CSR with Cloudflare，密钥类型选 ECC 或 RSA，主机名填 `example.com` 和 `*.example.com`，有效期按需选择。点 Create，格式选 PEM，把 Origin Certificate 和 Private Key 都复制下来。私钥只显示这一次，关掉页面后无法再查看。

## 第二步：安装到源站

把证书和私钥保存成两个文件，在 Nginx 的 443 站点里引用：

```bash
sudo mkdir -p /etc/ssl/cloudflare
sudo nano /etc/ssl/cloudflare/example.com.pem    # 粘贴 Origin Certificate
sudo nano /etc/ssl/cloudflare/example.com.key    # 粘贴 Private Key
sudo chmod 600 /etc/ssl/cloudflare/example.com.key
```

```nginx
server {
    listen 443 ssl;
    http2 on;    # nginx 1.25.1 及以上
    server_name example.com www.example.com;

    ssl_certificate     /etc/ssl/cloudflare/example.com.pem;
    ssl_certificate_key /etc/ssl/cloudflare/example.com.key;
    ssl_protocols       TLSv1.2 TLSv1.3;

    root /var/www/example.com;
}
```

```bash
sudo nginx -t && sudo systemctl reload nginx
```

宝塔、1Panel 用户可以在站点的 SSL 页面里选择“使用已有证书”一类的选项，把证书和私钥分别粘贴进去，见 [宝塔面板配置 SSL 证书](https://ssl.sh/zh/guides/bt-panel-ssl/)。面板上看到的颁发者会是 Cloudflare 的 Origin CA。浏览器不信任这家私有 CA，但只要访客流量都经过 Cloudflare 代理，就不影响使用。注意别让面板的 Let's Encrypt 自动续签去覆盖这张证书，两者只能选一个。

## 第三步：切换到 Full (strict)

在 **SSL/TLS → Overview** 里把加密模式设为 Full (strict)，此后 Cloudflare 每次连接源站都会校验证书。不要用 Flexible：它让 Cloudflare 用明文连源站，源站再做 HTTPS 跳转时还很容易形成重定向死循环。

## 第四步：HTTP 跳转并限制源站

打开 **SSL/TLS → Edge Certificates → Always Use HTTPS**，让访客在边缘就被跳转到 HTTPS，同时去掉源站上可能引起循环的 80 端口跳转。还可以开启 Authenticated Origin Pulls，让源站只接受来自 Cloudflare 的 TLS 连接：按 Cloudflare 文档下载它的客户端 CA，在 Nginx 里加上 `ssl_client_certificate` 和 `ssl_verify_client on;`。再进一步，可以在源站防火墙里只放行 Cloudflare 的 IP 段。

## 验证

公网检查看到的是 Cloudflare 的边缘证书，也就是访客看到的那张。用 [SSL 证书检查](https://ssl.sh/zh/tools/ssl-checker/)，或在终端运行：

```bash
curl ssl.sh/example.com
```

要检查源站证书本身，直接连源站 IP：

```bash
openssl s_client -connect 203.0.113.10:443 -servername example.com </dev/null 2>/dev/null \
  | openssl x509 -noout -subject -issuer -dates
```

颁发者是 Cloudflare 的 Origin CA，浏览器直连时不会信任它，这是正常的。

## 自动续期

两张证书的续期方式不同。边缘证书（Universal SSL）由 Cloudflare 自动签发和续期。Origin CA 证书不会自己续期：到你选定的日期就过期，之后 Full (strict) 模式下 Cloudflare 会返回 526 错误。把到期日写进监控，提前按第一、二步换新证书；想自动化的话，Cloudflare 也提供创建 Origin CA 证书的 API。边缘一侧可以把主机名加到 [ssl.sh 监控](https://ssl.sh/zh/monitor/)（开发中）。

如果你更希望源站证书也能被浏览器信任、方便随时暂停 Cloudflare，就改用 Let's Encrypt：[Certbot + Cloudflare DNS](https://ssl.sh/zh/guides/certbot-dns-cloudflare-wildcard/) 或 [acme.sh DNS API](https://ssl.sh/zh/guides/acme-sh-dns-api-wildcard/) 都能在不开放 80 端口的情况下申请通配符证书。注意 Let's Encrypt 默认证书 2027 年 2 月 10 日起改为 64 天，必须全自动续期。

## 常见问题排查

- **526 Invalid SSL certificate**：源站证书过期、没有覆盖这个主机名，或 Nginx 实际出示的是别的证书，用上面的 `openssl s_client` 命令检查。
- **525 SSL handshake failed**：Nginx 没有在 443 上启用 TLS，或者和 Cloudflare 没有共同支持的协议版本。
- **访客看到不受信任的证书**：DNS 记录没开代理（灰色云朵），浏览器直接连到了源站，见 [NET::ERR_CERT_AUTHORITY_INVALID](https://ssl.sh/zh/errors/net-err-cert-authority-invalid/)。
- **ERR_TOO_MANY_REDIRECTS**：SSL 模式是 Flexible，源站又跳转到 HTTPS，改成 Full (strict)。
- **开启 HTTPS 后提示混合内容**：见 [混合内容警告](https://ssl.sh/zh/errors/mixed-content-warning/)。
