GitHub Pages HTTPS证书自动签发错误解决

对自定义域名的GitHub Pages站点配置CDN会造成GitHub Pages的HTTPS证书无法自动签发。

GitHub Pages HTTPS证书自动签发错误解决

1 GitHub Pages与Let's Encrypt的HTTPS证书服务

自2016年起,GitHub Pages提供对自定义域名(custom domain)的HTTPS传输服务。

GitHubLet's Encrypt合作,为GitHub Pages站点的自定义域名自动签发Let's Encrypt的HTTPS证书。该证书有效期90天,正常情况下,GitHub对其到期自动更新。

2 问题描述

部署在GitHub Pages上的自定义域名站点出现证书错误问题。

Full SSL

我在CloudFlare上部署了本站点(heary.cn)的CDN,并启用了全程SSL Full (Strict),表示从客户机到CDN服务器以及从CDN服务器到源站,均要求SSL并只接受可信CA颁发的HTTPS证书。

8月17日晚间发现访问主页(heary.cn)时出现CloudFlare报错页面,提示访问源站时遭遇证书错误(CDN到源站的请求)。

经查,该项目仓库的设置中(Settings->GitHub Pages的Enforce HTTPS项)提示以下内容:

Enforce HTTPS — Not yet available for your site because the certificate has not finished being issued. Please allow 24 hours for this process to complete.

也就是说,GitHub Pages本应自动更新的证书实际上过期了也没有更新。

3 问题原因

通过搜索和查阅文档,可确定其原因与自定义域名的DNS解析记录有关。

HTTPS errors

GitHub Pages sites using custom domains that are correctly configured with CNAME, ALIAS, ANAME, or A DNS records can be accessed over HTTPS. For more information, see "Securing your GitHub Pages site with HTTPS."

It can take up to an hour for your GitHub Pages site to become available over HTTPS after you add and correctly configure your custom domain. After updating existing DNS settings, you may need to remove and re-add your custom domain to your GitHub account to trigger the process of enabling HTTPS. For more information, see "Using a custom domain with GitHub Pages."

If you've chosen to use Certification Authority Authorization (CAA) records, at least one CAA record must exist with the value letsencrypt.org for your GitHub Pages site to be accessible over HTTPS. For more information, see "Certificate Authority Authorization (CAA)" in the Let's Encrypt documentation.

Custom domains configured with A records

If you configured your custom domain using an A record, your A record must point to one of the following IP addresses for HTTPS to work:

  • 185.199.108.153
  • 185.199.109.153
  • 185.199.110.153
  • 185.199.111.153

After updating any A record IP addresses, you must remove and re-add your custom domain to the repository you’re using to publish your Pages site to trigger the process of enabling HTTPS. For more information, see "Configuring A records with your DNS provider" in "Setting up an apex domain."

在GitHub提供的针对自定义域名的Trouble Shooting文档中,可以看到,GitHub Pages要求启用HTTPS的自定义域名必须把DNS解析到以下4个IP地址上:

  • 185.199.108.153
  • 185.199.109.153
  • 185.199.110.153
  • 185.199.111.153

而使用CDN时,域名显然时解析到CDN的代理服务器上的。

4 解决方案

4.1 取消CDN代理

因此,如需正常使用GitHub Pages提供的自定义域名HTTPS服务(证书签发、自动更新),不可以使用第三方CDN服务。

在取消CDN服务后,确保新的DNS记录已经更新(通常需要稍等一段时间,如:10分钟,取决于DNS解析记录的TTL值)。

通过nslookup命令即可查询:

1
2
3
4
5
6
7
8
9
10
11
C:\Users\jyshen>nslookup heary.cn
服务器: voidc8.seu.edu.cn
Address: 121.248.60.8

非权威应答:
名称: heary.cn
Addresses: 185.199.108.153
185.199.109.153
185.199.110.153
185.199.111.153

  • DNS解析记录已经更新到GitHub指定IP上。
  • 实际上,如果多次反复查询,会发现解析结果中4个IP的次序随机的,不会集中解析到一个IP上,DNS以此实现对该域名源站服务器的负载均衡。

4.2 手动调起证书签发

DNS解析记录生效后,可以通过以下方法手动更新GitHub Pages的HTTPS证书:

  1. 在GitHub Pages站点设置中,删除Custom domain并点击Save以取消自定义域名;
  2. 重新设置Custom domain并Save以重新启用自定义域名。

随后,GitHub Pages会对自定义域名申请新HTTPS证书。几分钟左右重新验证该自定义域名即可正常访问。