泛域名证书申请

最近搭建起个人的英文博客,域名定为en.1991421.cn,之前的中文博客域名是1991421.cn,图床域名是static.1991421.cn。如果每个域名都申请单域名证书,后期维护过于麻烦。为了方便管理,且易于以后拓展新的子域名服务,因此决定申请泛域名证书。

泛域名

泛域名即服务于一个域名下多个子域名的证书。比如这里我要申请的*.1991421.cn证书可以在任意的子域名下使用,比如en.1991421.cn,或者static.1991421.cn。

注意

  • *.1991421.cn只可以在二级域名下使用,比如一级域名1991421.cn不行

  • 1991421.cn申请域名只可以在1991421.cn使用

  • 如果将1991421.cn单域名证书安装到en.1991421.cn上,当我们访问时,浏览器会提示站点不安全即证书无效

证书申请

这里我用certbot来进行申请Lets Encrypt免费证书,具体执行脚本可参见这里

这里贴出主要脚本

1
2
3
4
5
6
7
8
9
docker-compose run --rm --entrypoint "\
certbot certonly -w /var/www/certbot \
$staging_arg \
$email_arg \
--manual --preferred-challenges=dns \
$domain_args \
--rsa-key-size $rsa_key_size \
--agree-tos \
--force-renewal" certbot

证书申请中,终端会提示增加DNS Txt记录,按照提示在域名服务商网站增加对应解析记录即可。

当解析记录配置完成,终端继续执行,如果提示Congratulations即表示成功,按照返回信息中告知的证书所在位置使用即可。

注意

泛域名证书只能走DNS验证,因此需要手动添加DNS Text记录,如果验证类型配置错误,报错如下 Client with the currently selected authenticator does not support any combination of challenges that will satisfy the CA. You may need to use an authenticator plugin that can do challenges over DNS.
验证方式要唯一,假如脚本中同时指定了webroot,manual,报错如下 Too many flags setting configurators/installers/authenticators 'webroot' -> ‘manual'

写在最后

  • DNS验证相对webroot麻烦,但仅限于第一次,之后利用cerbot自动更新即可
  • 泛域名证书搞定后,对于新增任何二级域名服务就不需要单独申请证书了,还是方便不少

自动化申请/更新泛域名证书

renew证书时可以使用cerbot,其提供了hook,搭配DNS厂商的API解决程序化添加Text记录即可完全自动化。

  1. 安装
1
2
3
4
5
git clone https://github.com/alanhg/certbot-letencrypt-wildcardcertificates-alydns-au.git

cd certbot-letencrypt-wildcardcertificates-alydns-au

chmod 0777 au.sh
  1. 配置

编辑domain.ini添加对应DNS 认证信息即可。

  1. 首次手动执行申请
1
certbot certonly -d x.1991421.cn --manual --preferred-challenges dns --manual-auth-hook "/var/www/certbot-letencrypt-wildcardcertificates-alydns-au/au.sh python txy add" --manual-cleanup-hook "/var/www/certbot-letencrypt-wildcardcertificates-alydns-au/au.sh python txy clean" -m x@myemail

申请OK后可以使用certbot certificates来查看已申请证书

  1. crontab自动化

完整信息查看,https://github.com/alanhg/certbot-letencrypt-wildcardcertificates-alydns-au

参考资料