# Cloudflare Pages 自定义域名：HTTPS、CAA 与 Verifying 卡住

> Cloudflare Pages 绑定自定义域名并启用 HTTPS：根域名和子域名的 DNS 区别、Cloudflare 需要的 CAA 记录，以及域名一直停在 Verifying 时怎么排查。

Source: https://ssl.sh/zh/guides/cloudflare-pages-custom-domain/
Last updated: 2026-11-10

Cloudflare Pages 的自定义域名证书由 Cloudflare 自己签发和续期。你在 Pages 项目里添加域名，Cloudflare 通过 HTTP 方式验证，再从合作 CA（Let's Encrypt、Google Trust Services 或 SSL.com）中挑一家签证书。根域名 `example.com` 必须是同一 Cloudflare 账户下的站点；子域名可以留在任何 DNS 服务商，只要加一条 CNAME 指向 `项目名.pages.dev`。

步骤和菜单名称以 Cloudflare 官方文档为准（截至 2026 年 11 月）。`my-site.pages.dev` 和 `example.com` 是示例。

## 速查表

| 问题 | Cloudflare Pages 的做法 |
|---|---|
| 自动证书的 CA | Let's Encrypt、Google Trust Services 或 SSL.com，由 Cloudflare 选择 |
| 验证方式 | 对自定义域名做 HTTP 验证 |
| 根域名 `example.com` | 必须是 Cloudflare zone，CNAME 由 Cloudflare 自动创建 |
| `www` 和其他子域名 | `CNAME` 指向 `my-site.pages.dev`，DNS 可以不在 Cloudflare |
| CAA 要放行 | `letsencrypt.org`、`pki.goog; cansignhttpexchanges=yes`、`ssl.com` |
| 通配符自定义域名 | Pages 文档没有介绍，每个主机名单独添加 |
| 上传自有证书 | Pages 没有上传入口；站点级自定义证书面向 Business 和 Enterprise |
| 每个项目的自定义域名数 | Free 100、Pro 250、Business 和 Enterprise 500 |

## 国内访问说明

从中国大陆访问 `pages.dev` 和绑定到 Pages 的域名，速度和可用性都没有保证，不同地区、不同运营商差别很大，部分网络下可能打不开，这和证书配置无关。面向国内用户、需要 ICP 备案的网站，建议把静态资源放到阿里云、腾讯云等国内云的对象存储加 CDN，HTTPS 配置参考 [腾讯云 CDN 配置 HTTPS](https://ssl.sh/zh/guides/tencent-cloud-cdn-https/) 或 [阿里云 CDN 配置 HTTPS](https://ssl.sh/zh/guides/aliyun-cdn-https/)。

## 第一步：先在 Pages 项目里添加域名

必须先在 Pages 控制台添加域名，再改 DNS：

1. 进入 **Workers & Pages**，选择你的 Pages 项目。
2. 打开 **Custom domains**，点 Set up a domain。
3. 输入主机名，点 **Continue**。

如果跳过这一步，直接在 DNS 里加 CNAME 指向 `my-site.pages.dev`，这个主机名不会关联到你的项目，访问时会报 `522` 错误。

## 第二步：添加 DNS 记录

根域名必须接入同一个 Cloudflare 账户；子域名可以留在外部 DNS，加一条 CNAME 指向 `my-site.pages.dev` 就行。

**根域名。** 把 `example.com` 作为站点添加到 Cloudflare 账户，再到注册商（阿里云、腾讯云等）把 NS 改成 Cloudflare 分配的两个名称服务器。站点激活后，在 Pages 里确认域名时，Cloudflare 会自动创建 CNAME 记录。

**子域名，DNS 留在外部。** 在阿里云解析或 DNSPod 里加一条 CNAME：

| 类型 | 主机记录 | 记录值 |
|---|---|---|
| `CNAME` | `shop` | `my-site.pages.dev` |

如果这个域名已经在 Cloudflare 上，记录会自动添加。Enterprise 站点如果开了 zone hold，要先解除再添加域名，否则自定义子域名无法激活。

**根域名和 `www` 一起用。** 把根域名设为 Pages 自定义域名，再把 `www` 跳转过去。Cloudflare 的做法是建一条 Bulk Redirect：源 `www.example.com`，目标 `https://example.com`，状态码 `301`，勾选保留路径和查询参数；再给 `www` 加一条开启代理的占位记录：

| 类型 | 名称 | IPv4 地址 | 代理状态 |
|---|---|---|---|
| `A` | `www` | `192.0.2.1` | Proxied |

`192.0.2.1` 是文档保留地址，只起占位作用，请求会被 Cloudflare 代理直接用跳转响应。想让两个域名都直接提供内容，就把 `www.example.com` 也加成第二个自定义域名。

## 第三步：检查 CAA 记录

如果域名的 CAA 没有放行 Cloudflare 用的 CA，证书就签不出来。Pages 文档给出的完整写法是：

```dns
example.com.  300  IN  CAA  0 issue "letsencrypt.org"
example.com.  300  IN  CAA  0 issue "pki.goog; cansignhttpexchanges=yes"
example.com.  300  IN  CAA  0 issue "ssl.com"
example.com.  300  IN  CAA  0 issuewild "letsencrypt.org"
example.com.  300  IN  CAA  0 issuewild "pki.goog; cansignhttpexchanges=yes"
example.com.  300  IN  CAA  0 issuewild "ssl.com"
```

同一域名下还有别的业务在用其他 CA（比如国内云上买的证书），把对应的 `issue` 记录保留下来。Cloudflare 的排错文档提到，关闭了 Universal SSL 或者使用外部 DNS 服务商时，最容易出现 CAA 缺失的问题。可以用 [CAA 检测工具](https://ssl.sh/zh/tools/caa-checker/) 确认。

## 通配符和自有证书

Pages 文档只介绍了逐个添加主机名的方式，所以每个名字都要单独加一个自定义域名。在站点层面，完整接入（full setup）时 Universal SSL 覆盖根域名和一级子域名，更深层级的名字需要 Total TLS 或高级证书。

Pages 本身没有上传证书的地方。Cloudflare 的自定义证书上传是站点级功能，面向 Business 和 Enterprise 客户，而且 Cloudflare 不会替你续期。如果 Pages 站点必须使用某家 CA 的证书，买证书前先向 Cloudflare 确认它是否适用于你的 Pages 主机名。

## 验证

证书签发后，自定义域名返回由 Let's Encrypt、Google Trust Services 或 SSL.com 签发的有效证书。用 [SSL 证书检查](https://ssl.sh/zh/tools/ssl-checker/) 检查，或在终端运行：

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

再确认证书和签发 CA：

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

三家 CA 都可能出现，续期后还可能换一家，不要在客户端里固定（pin）某一家。

## 续期

不需要手动续期，签发和续期都由 Cloudflare 管理；以 Universal SSL 为例，Cloudflare 文档写明证书有效期 90 天，到期前 30 天开始自动续期。会出问题的是 DNS：把这个主机名改指到别处，Pages 自定义域名就会变成未激活，再改回来要等重新激活，期间访问会报错。想临时把流量切走，应该用 Origin Rule 或重定向规则，而不是改 DNS 记录。公开证书现在最长 200 天，2027 年 3 月 15 日起最长 100 天，Cloudflare 的 90 天证书已经满足。建议把域名加到 [ssl.sh 监控](https://ssl.sh/zh/monitor/)（开发中），域名失效时能早点发现。

## 排查：一直停在 Verifying

域名停在 **Verifying** 阶段不动，按 Cloudflare 的清单逐项检查。

**HTTP 验证被拦住。** Pages 需要访问域名上的一个 HTTP 地址来验证。Cloudflare Access、重定向规则、Worker、WAF 自定义规则或 Client-Side Security 的内容规则挡在前面，验证就完成不了。用下面的命令测试：

```bash
curl -s -o /dev/null -D - https://example.com/.well-known/acme-challenge/randomstring
```

如果返回 `302` 并跳到 `cloudflareaccess.com`，说明是 Access 拦截了。先暂时关掉对应的 Access 策略（或重定向、Worker），等验证通过再打开。

**缺少 CAA 记录。** 对根域名（子域名单独建了 zone 的就查子域名）运行 `dig CAA example.com`。比如只有一条 `0 issue "amazon.com"`，Cloudflare 的三家 CA 就全被挡住了，按第三步加上 6 条记录。详见 [CAA 记录阻止签发](https://ssl.sh/zh/errors/caa-record-prevents-issuance/)。

**zone hold。** 设置期间先解除，域名激活后再恢复。

**只有自定义域名报错。** `my-site.pages.dev` 正常、自定义域名异常时，说明是站点（zone）上的缓存、规则等设置作用在了开启代理的记录上。把记录临时改成 DNS only 测试，再回头检查站点配置。

以上都检查过，超过 15 分钟仍在 Verifying，就联系 Cloudflare 支持。
