用Certbot给在Cloudflare上的domain申请Let’s Encrypt的泛域名证书

自从几年前开始使用Let’s Encrypt的SSL证书后,一直就对针对每个子域名都要申请单独的证书这事深恶痛绝,不过当时Let’s Encrypt还都根本没支持泛域名证书,所以也就是只能是想想,好在Certbot之类的工具对于多个子域名的申请和更新倒是没啥麻烦的,一键式一路都选OK就行,反正支持都是Apache和Nginx这种最流行的web server,自己搞定conf文件,Certbot和其他工具的工作质量还是没说的。然后差不多在3年前看到有通知邮件说准备泛域名证书上线了,当时还挺激动,但一找发现文档很匮乏,也没啥攻略,且支持泛域名证书申请的只能是DNS Challenge,那个时候DNS还没迁到能支持有API动态改动DNS记录的供应商,所以了解了一下就暂时放弃了,因为Certbot一直工作正常也就懒得再动,后来挂到Cloudflare之后使用API Token拉了俩DDNS,觉得也许是机会来重新折腾一下这事了,否则不用个野卡(Wildcard)证书也有点太low了,那么就开干吧。

干活之前肯定要先搜搜前人先辈们都干过啥,有啥坑别人踩了咱们就闪过,嘿嘿,一搜还真有不少人都做过泛域名证书了,但要么是CentOS,要么是Apache,要么用的ACME的变种,想偷懒就只能加我自己的环境的条件,例如:

  • Ubuntu的OS,而不是CentOS什么其他的
  • Certbot,不是ACME.SH
  • Cloudflare的DNS提供商,不是腾讯,阿里什么的

然后还是发现了不少文章,不过有篇大学刚毕业的小同学的文章:使用cloudflare API token申请let’s encrypt泛域名证书算是最贴切了,虽然这个一年半之前的文章细微的某些地方跟我的环境还是不太一样,但基本上就是这个方向,那就动手,下面的思路等啥的就不细说了,除非跟这篇文章不一致才会解释一下。

因为要把域名挂在Cloudflare上,所以肯定要去申请个账号,然后把域名给Park上去,就是至少NS的记录要指过去,让Cloudflare来管理你的域名解析,否则后面的API Token就没啥用了,申请完如图:

看到了这个图就说明你的域名Park成功了,也就是说可以继续后面的工作了。

下一步是申请API Token,界面跟Winrey的截图差不多,不过多了些选项,贴个图说明一下:

  • 按照从上往下红框的顺序来解释:
    1. API Token是菜单,点击就打开这个页面
    2. 下面填这个Token的名字,帮助你记忆
    3. 这些是权限,就是可以改DNS记录,读取Zone记录
    4. 这个是选这个Token的工作范围,例如哪个账号,哪个Domain的区域,现在是工作正常的,没有了之前Winrey说的有bug。我只有一个账号,账号下面只有一个域名,所以选哪个选项都是一样的效果,所以就选All Zones了。
    5. 这个是调用客户端的IP黑白名单,可以白名单限制只能访问的,也可以用黑名单限制不允许访问的IP,安全控制方面的特色。
    6. 最后这个是Token的有效时间区间,也是安全方面的控制。

可以看到新的Token界面带来了更多的安全设置,看来这一年多Cloudflare在安全上有很大的改善啊,赞一个!!这种token的因为要明文使用,通常都会是潜在的安全隐患,从IP和时间上做限制之后安全了很多。

申请完Token之后要保存下来,因为后面要用到,Cloudflare也提供一个验证的脚本,让你确保你申请到的这个token是工作正常,我也跑了一下确认无误之后才保存到keepass的库里。

接下来开始准备cloudflare.ini文件,这个文件会被Certbot用于直接做DNS Challenge,所以非常重要,没有这个文件就无法生存泛域名证书了,具体步骤如下:

#创建目录
mkdir -p ~/.secret/certbot

#编辑ini文件
nano ~/.secret/certbot/cloudflare.ini

#填入下面内容,记住一定要把红色的token替换你自己上面生成的token
# Cloudflare API token used by Certbot
dns_cloudflare_api_token = _QgHxQuNL2pB5wlBOsDvbY5P_Q5YzlAKodatp56a-kM0

#设置文件正确权限
chmod 600 ~/.secret/certbot/cloudflare.ini

接下来的就是安装Certbot了,如果大家没有在自己的服务器上之前申请过Let’s Encrypt证书,那么可能你们的服务器上没有装Certbot,我的服务器上已经用Ubuntu的apt-get装过一个版本且使用正常,但我看讨论说现在Certbot的团队极力推荐大家用snap来安装Certbot,如果是这样,趁着这个机会干脆换上snap安装的版本吧,那么要先删除已经安装的Certbot,大家可以用自己的apt,yum等的全做,我这里的命令行如下:

#删除其他方式安装的certbot
sudo apt-get remove certbot

然后如果你的系统里没有snap还要安装一下Snap

#如果没有安装snap,用下面的命令安装
sudo apt update
sudo apt install snapd

再下来就是安装Certbot了,这个安装还是很自动化的

#使用snap安装Certbot
sudo snap install --classic certbot

#准备certbot命令行
sudo ln -s /snap/bin/certbot /usr/bin/certbot

#查看插件
sudo certbot plugins

#如果没有Nginx安装Nginx的插件
sudo snap install certbot-nginx

#安装cloudflare的插件
sudo snap install certbot-dns-cloudflare

然后就可以生成泛域名证书了

#生成泛域名证书,记住要把abc.com换成你的域名
certbot --dns-cloudflare -d abc.com -d *.abc.com -i nginx

脚本运行中要问你要Cloudflare的配置文件,输入下面字符串:

~/.secret/certbot/cloudflare.ini

接下来要根据自己的情况去选择什么virtual host的配置文件需要添加新生成的泛域名证书,这个完全取决于你放了多少个网站,都是怎么配的自己的conf文件,我就有10多个文件仔细的去选择之后就可以立刻使用泛域名证书了,然后肯定里要例行校验一下Certbot的renew脚本:

sudo certbot renew --dry-run

到这里本地部署和生成使用泛域名证书就算成功了,但要考虑到还需要没几个月都要更新一下过期的证书,所以还需要是用Cron或者Systemctl的List-timer来定时检验一下证书是否快过期了,如果快过期就自动更新,不过现在的Certbot貌似都自己生成Certbot Service,所以只是通过下面的命令查看一下是不是这个定时任务已经安装了:

systemctl list-timers -all

因为我用Cloudflare做了CDN,所以按照目前的CDN的代理工作方式,在浏览器上直接输入站点的URL看到的证书是Cloudflare的SSL证书,而自己的部署的证书只能是Cloudflare告诉你那个证书是不是正常,如下图所示:

虽然我知道它工作正常,但是看不到还是让我有点小小的郁闷,我都想是不是不要代理某个site,然后让自己点击一下证书爽爽,哈哈。。至此所有的工作就结束了,其他的服务器跑的子域名可以保留现在针对子域名生成的证书,或者是按照上面的流程走一遍转成泛域名证书,等有时间在继续清理吧。

相关的文章

One Response to “用Certbot给在Cloudflare上的domain申请Let’s Encrypt的泛域名证书”

Leave a Reply

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据