在站点上启用 Let's Encrypt 通配符证书

#站点记录 @博客
版权声明:所有博客文章除特殊声明外均为原创,允许转载,但要求注明出处。

今年早些时候,我曾在本站上尝试使用 Let's Encrypt 推出的新通配符证书,但出现了一些问题。由于网站原有的证书还在正常使用,所以这个事情的优先级并不高,加上当时还有不少别的事情,就没有再继续下去。昨天,我再次进行了测试,这次终于成功生成证书,但过程中仍然走了一些弯路。本文对此作一个记录总结,以便自己今后、以及其他朋友参考。

软件要求

按照网络上的资料,要申请通配符证书,certbot 客户端需要在 0.23 版本以上。我的系统在例行升级后,certbot 目前的版本是 0.26.1,满足要求。如果客户端是比较旧的版本,请先升级系统。

另外,网上许多参考资料使用的命令行是 certbot-auto 而不是 certbot。我没有深入研究这两个命令有何不同,不过看起来它们的参数是完全一致的,所以我继续使用 certbot

获取证书

参考网上资料,申请证书需使用如下命令:

sudo certbot certonly -d yuhao.space -d *.yuhao.space --manual --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory

该命令有几点需要注意:

  • certbot 申请证书需首先验证域名的所有权,基本上有基于 DNS 和基于服务器验证两种手段,但通配符证书只能使用 DNS 方式。因此参数要声明 dns-01
  • 必须明确指示调用的服务 URL,因为默认的服务地址(v01)是不支持通配符证书的。某些网上资料没有使用这个参数,按照它们的步骤运行会导致运行失败;
  • 特别需要注意的一点是,通配符域名(*.domain)的格式不能匹配主域名,也不匹配多级子域名。要让子域名和主域名使用同一个证书,必须加两个 -d 参数,把主域名和通配符域名都声明进去。我就是在这点上吃了亏,申请以后才发现主域名不能用,不得不删掉重来,浪费了不少时间。

命令执行时会向你询问几个问题:是否同意用户协议(YES),输入邮箱地址,接下来的问题是这样的:

NOTE: The IP of this machine will be publicly logged as having requested this certificate. If you're running certbot in manual mode on a machine that is not your server, please ensure you're okay with that.

Are you OK with your IP being logged? (Y)es/(N)o:

从信息看似乎只是记录IP地址,但有的资料说是“IP证书绑定”,这可让人有点紧张,难道以后只能在这台机器上续订证书?不过综合其他信息看应该不是,后来把证书复制到目标机器上测试也没有问题,应该是 OK 的。

执行最后会要求你在 DNS 服务器上按要求生成两条 TXT 记录。我的 DNS 服务商是 Godaddy,按照说明添加即可。但 DNS 的修改可能是有网络延时的,所以修改后最好用命令确认生效后再继续申请证书:

dig _acme-challenge.yuhao.space txt

如果看到了新添加 TXT 内容,说明 DNS 修改已生效,可以继续 生成证书了。最后会看到 Congratulations 的字样,以及证书的生成位置。

网站修改

以前,我的想法是个人网站内容不会太多,没有必要分子域名,此外也会分散 SEO 的权重。不过维护一段时间后,我的想法有了改变。把内容分布到各个子域名意味着我可以尝试其他的程序结构而不破坏其他内容,并且有些内容可以尝试使用第三方程序而不是完全自己编写,而单站点的程序就没有这种灵活性了。但是,子域名带来的一个问题是为每个子域名单独申请 HTTPS 证书维护起来太麻烦,这也是我一直没有动手改造网站的主要原因之一。

现在,这个问题通过通配符证书解决了,我只需要维护一个证书即可。后续我希望对网站作一些比较大的调整,不过目前的主站还是沿用原有的结构,先把部分内容迁移到子域名去,并且也会新开发一些内容。当然,有没有足够的时间仍然是一个问题......

顺便的说明:Windows Subsystem for Linux

本文中运行的命令大部分是在 WSL (Windows Subsystem for Linux)中运行的。虽然 WSL 也存在一些问题,不过在多数情况下已经可以当成一个完整的 Linux 来使用,还是很方便的。

不过现在使用 WSL 也发现一个问题。从前,WSL 是作为系统附件安装的,其目录位于 C 盘某个固定的位置。现在则改成了需要从 Windows Store 安装发行版,但原有的目录却找不到了,这样需要检查一些文件,或需要运行 Windows 工具的时候,却不知道往哪里找了。(我不希望为了这个目的再 cp 一遍文件)。查找了资料才知道,从商店安装的 Linux 位于类似这样的位置:C:\Users\<user>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu***\LocalState\rootfs,其中 *** 为系统版本号和一些随机数字后缀,从这里就能找到你想要的文件。