容器与平台
GitHub Pages 自定义域名 HTTPS 配置教程
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。
第一步:验证域名并在仓库里设置
GitHub 建议先在个人或组织设置里验证域名,再把它加到仓库。验证过的域名别人不能拿去绑自己的 Pages 站点,可以防止 DNS 已经指向 GitHub、但仓库被删时被人接管。
然后打开仓库,进入 Settings > Pages,在 Custom domain 里填 example.com(或 www.example.com),点 Save,自动 DNS 检查立即开始。
第二步:添加 DNS 记录
根域名要把 4 条 A 记录都加上:
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。检查命令:
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 访问:
example.com. 3600 IN CAA 0 issue "letsencrypt.org"
完全没有 CAA 记录也没问题。可以用 CAA 检测工具 查看当前策略,原理见 CAA 记录详解。
第四步:强制 HTTPS
域名旁出现对勾后,在 Settings > Pages 里勾选 Enforce HTTPS,HTTP 请求就会自动跳转到 HTTPS。2016 年 6 月 15 日之后创建、使用 github.io 域名的站点本来就自动走 HTTPS。
开了 HTTPS 地址栏还是不显示安全锁,多半是页面里有 http:// 开头的图片、CSS 或 JS。把它们改成 https://(Jekyll 站点一般在 _layouts 目录里),或用 混合内容扫描 找出来,详见 混合内容警告。
通配符证书和自有证书
GitHub Pages 只给你配置的那个域名签证书。文档里没有上传证书的入口,并且强烈建议不要用 *.example.com 这类通配符 DNS 记录,因为会带来子域名被接管的风险。需要 OV/EV 证书、指定 CA 或通配符证书时,只能在前面加一层支持自定义证书的 CDN 或反向代理。
验证
证书部署后,域名返回 Let's Encrypt 签发的证书;勾选 Enforce HTTPS 后,HTTP 请求跳转到 HTTPS。用 SSL 证书检查 检查,或在终端运行:
curl ssl.sh/example.com
查看 GitHub 给你的域名返回的证书:
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 监控(开发中) 盯着。
常见问题排查
- Certificate not yet created:这是 GitHub 文档里给签发卡住的情况起的名字。点 Save 几分钟后还没好,就点域名旁边的 Remove,重新输入域名再点 Save,签发流程会取消并重新开始。
- Enforce HTTPS 勾不上:证书还没准备好,等最多一小时,再重复上面的删除重填。
- 改了 DNS 之后 HTTPS 失效:GitHub 提到,修改现有 DNS 设置后可能需要删除并重新添加自定义域名,才能重新触发 HTTPS 启用流程。
- CAA 挡住签发:加上
0 issue "letsencrypt.org",见 CAA 记录阻止签发。 - 域名太长:完整域名必须少于 64 个字符才能签出证书。
- 浏览器提示证书和域名不匹配(NET::ERR_CERT_COMMON_NAME_INVALID):多余的
A/AAAA或旧的 CNAME 把部分访客带去了别的服务器,删掉所有不指向 GitHub 的记录。
常见问题
GitHub Pages 自定义域名的证书是哪家签的?
Let's Encrypt。自动 DNS 检查通过后,GitHub 排队向 Let's Encrypt 申请证书,拿到后自动部署到负责 TLS 终止的服务器,完成时域名旁边会出现一个对勾。
Enforce HTTPS 是灰的,勾不上怎么办?
通常是因为证书还没签下来。GitHub 说配置好域名后最多要一小时。超过时间还不行,先检查 DNS 记录和 CAA,再把自定义域名删掉、重新输入并点 Save,重新触发签发。
能上传自己的证书或用通配符证书吗?
都不能。GitHub 文档只介绍了自动签发的 Let's Encrypt 证书,没有上传入口;还强烈建议不要用通配符 DNS 记录,因为有被他人接管子域名的风险。需要自有证书时,只能在前面加一层支持自定义证书的 CDN 或反向代理。
域名太长会有影响吗?
会。GitHub 提醒整个域名必须少于 64 个字符才能签出证书,因为 RFC 3280 规定 Common Name 最长 64 个字符。