# GitHub Pages 自定义域名开启 HTTPS：配置与排错

> GitHub Pages 自定义域名开启 HTTPS 要加哪些记录：根域名 4 条 A 记录和 AAAA、www 的 CNAME、CAA 放行 letsencrypt.org，以及 Certificate not yet created 怎么处理。

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

GitHub Pages 会自动为自定义域名申请免费的 Let's Encrypt 证书。你在仓库 Pages 设置里保存域名后，GitHub 先做 DNS 检查，通过后申请并部署证书，域名旁边出现对勾就说明好了，最多可能要一小时。之后就能勾选 **Enforce HTTPS** 强制跳转。GitHub Pages 不能上传自己的证书，也不建议用通配符 DNS。

步骤和菜单名称以 GitHub 官方文档为准（截至 2026 年 11 月）。`octocat.github.io` 和 `example.com` 分别代表你的账号地址和域名。

## 速查表

| 问题 | GitHub Pages 的做法 |
|---|---|
| 自动证书的 CA | Let's Encrypt |
| 根域名 `example.com` | 4 条 `A` 记录（可再加 4 条 `AAAA`），或 ALIAS/ANAME 指向 `octocat.github.io` |
| `www` 和其他子域名 | `CNAME` 指向 `octocat.github.io`（不带仓库名） |
| CAA 要放行 | `letsencrypt.org` |
| 通配符证书 | 不提供，且强烈不建议用通配符 DNS |
| 上传自有证书 | 文档没有提供 |
| 多久生效 | DNS 正确后最多一小时 |

## 国内访问说明

GitHub Pages 的服务器在境外，从中国大陆访问时快时慢，部分地区和网络可能打不开，这不是证书配置能解决的。写技术博客、开源项目文档用它很方便；如果网站要面向国内用户长期稳定访问，或者需要 ICP 备案，建议把静态文件放到阿里云 OSS、腾讯云 COS 加 CDN 这类国内服务上，HTTPS 配置见 [阿里云 CDN 配置 HTTPS](https://ssl.sh/zh/guides/aliyun-cdn-https/)。

## 第一步：验证域名并在仓库里设置

GitHub 建议先在个人或组织设置里验证域名，再把它加到仓库。验证过的域名别人不能拿去绑自己的 Pages 站点，可以防止 DNS 已经指向 GitHub、但仓库被删时被人接管。

然后打开仓库，进入 **Settings > Pages**，在 Custom domain 里填 `example.com`（或 `www.example.com`），点 Save，自动 DNS 检查立即开始。

## 第二步：添加 DNS 记录

根域名要把 4 条 `A` 记录都加上：

```dns
example.com.  3600  IN  A     185.199.108.153
example.com.  3600  IN  A     185.199.109.153
example.com.  3600  IN  A     185.199.110.153
example.com.  3600  IN  A     185.199.111.153
```

需要 IPv6 的话，再加 `2606:50c0:8000::153`、`2606:50c0:8001::153`、`2606:50c0:8002::153`、`2606:50c0:8003::153` 这 4 条 `AAAA`。DNS 服务商支持 ALIAS 或 ANAME 的，也可以直接把根域名指向 `octocat.github.io`。

`www` 和其他子域名加一条 `CNAME`，指向 `octocat.github.io`，记录值里不要带仓库名。在阿里云解析或 DNSPod 里，主机记录分别填 `@` 和 `www`。

根域名和 `www` 最好都配上，GitHub 会自动在两者之间做跳转：自定义域名填的是 `example.com`，访问 `www.example.com` 就会被跳到 `example.com`，反过来也一样。

多余的记录会让证书签不出来。GitHub 文档写明：`@` 上任何额外的 `A`、`AAAA`、`ALIAS`、`ANAME` 记录，或者子域名上指向别处的 `CNAME`，都可能导致证书生成失败。国内 DNS 服务商常见的“默认线路 + 境外线路”分开解析，也要确认每条线路都指向 GitHub。检查命令：

```bash
dig example.com +noall +answer -t A
dig example.com +noall +answer -t AAAA
dig www.example.com +noall +answer -t CNAME
```

## 第三步：在 CAA 里放行 Let's Encrypt

如果设了 CAA 记录，至少要有一条值为 `letsencrypt.org`，否则网站无法通过 HTTPS 访问：

```dns
example.com.  3600  IN  CAA  0 issue "letsencrypt.org"
```

完全没有 CAA 记录也没问题。可以用 [CAA 检测工具](https://ssl.sh/zh/tools/caa-checker/) 查看当前策略，原理见 [CAA 记录详解](https://ssl.sh/zh/learn/caa-records/)。

## 第四步：强制 HTTPS

域名旁出现对勾后，在 **Settings > Pages** 里勾选 Enforce HTTPS，HTTP 请求就会自动跳转到 HTTPS。2016 年 6 月 15 日之后创建、使用 `github.io` 域名的站点本来就自动走 HTTPS。

开了 HTTPS 地址栏还是不显示安全锁，多半是页面里有 `http://` 开头的图片、CSS 或 JS。把它们改成 `https://`（Jekyll 站点一般在 `_layouts` 目录里），或用 [混合内容扫描](https://ssl.sh/zh/tools/mixed-content-scanner/) 找出来，详见 [混合内容警告](https://ssl.sh/zh/errors/mixed-content-warning/)。

## 通配符证书和自有证书

GitHub Pages 只给你配置的那个域名签证书。文档里没有上传证书的入口，并且强烈建议不要用 `*.example.com` 这类通配符 DNS 记录，因为会带来子域名被接管的风险。需要 OV/EV 证书、指定 CA 或通配符证书时，只能在前面加一层支持自定义证书的 CDN 或反向代理。

## 验证

证书部署后，域名返回 Let's Encrypt 签发的证书；勾选 Enforce HTTPS 后，HTTP 请求跳转到 HTTPS。用 [SSL 证书检查](https://ssl.sh/zh/tools/ssl-checker/) 检查，或在终端运行：

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

查看 GitHub 给你的域名返回的证书：

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

颁发者应该是 Let's Encrypt 的中间证书，SAN 列表里要有你的域名。没有的话，说明签发还没完成或者 DNS 检查没通过。

## 续期

GitHub 文档讲了证书怎么申请和部署，但没有专门讲续期。Pages 设置里没有任何需要你续期的地方，也没有上传入口，所以续期由 GitHub 负责。你能控制的是 DNS：记录一直指向 GitHub，CAA 一直放行 `letsencrypt.org`。Let's Encrypt 的默认有效期 2027 年 2 月 10 日起缩短到 64 天、2028 年 2 月 16 日起缩短到 45 天，而且 2025 年 6 月 4 日以后不再发到期提醒邮件，建议用 [ssl.sh 监控](https://ssl.sh/zh/monitor/)（开发中） 盯着。

## 常见问题排查

- **Certificate not yet created**：这是 GitHub 文档里给签发卡住的情况起的名字。点 Save 几分钟后还没好，就点域名旁边的 Remove，重新输入域名再点 Save，签发流程会取消并重新开始。
- **Enforce HTTPS 勾不上**：证书还没准备好，等最多一小时，再重复上面的删除重填。
- **改了 DNS 之后 HTTPS 失效**：GitHub 提到，修改现有 DNS 设置后可能需要删除并重新添加自定义域名，才能重新触发 HTTPS 启用流程。
- **CAA 挡住签发**：加上 `0 issue "letsencrypt.org"`，见 [CAA 记录阻止签发](https://ssl.sh/zh/errors/caa-record-prevents-issuance/)。
- **域名太长**：完整域名必须少于 64 个字符才能签出证书。
- **浏览器提示证书和域名不匹配**（[NET::ERR_CERT_COMMON_NAME_INVALID](https://ssl.sh/zh/errors/net-err-cert-common-name-invalid/)）：多余的 `A`/`AAAA` 或旧的 CNAME 把部分访客带去了别的服务器，删掉所有不指向 GitHub 的记录。
