基于 certbot 开发的工具,letscertbot 给网站自动申请/续期/部署免费证书

作者: 王炳明 分类: 网站建设 发布时间: 2021-07-10 19:33 热度:1,378

这两天在给自己的网站做 SEO ,顺便想到了之前写过的几个在线文档一直都是 http 协议,之前为什么一直没有上,是因为那个在线文档,使用的是 RTD 进行托管,它给我省了很多事,我愿意牺牲 https,都是文档类,也没什么重要数据,不用管安全不安全的。

但最近在做主站的 SEO ,听说现在 https 的权重要远大于 http ,所以还是要好好搞一下。

虽然在 RTD 的界面上也表示可以配置 https ,但是实际配置并没有效果,也没有可以配置数字证书的地方。

这是我第一次有了放弃 RTD 的想法。

后来我又关注了下 sitemap,原来 RTD 构建出来的 sitemap.xml 一直是有问题的,而且摸索了很久,也没有找到解决方案。害,用人家的黑盒子 就是这么麻烦,出现问题想自己调试都没办法。

这下,我想彻底放弃 RTD 了。

于是最近花了好几天,一直在忙一件事,就是把之前的五个在线文档,全部脱离 RTD 部署到自己的个人服务器上。

相信这两天,有在看那几个在线文档的朋友,应该有遇到间断性不能访问的问题吧?

没错,是我搞的鬼。

但是现在已经经全部迁移完成,大家可以正常访问。

迁移到自己的服务器,主要为了方便以后对网站做 SEO 优化,但是脱离 RTD 后,又带来了不少的问题,也把我搞得非常头疼,花了很久的时间才搞定,这些问题我也都记录下来了。后面会继续分享出来。

今天这篇文章主要分享 给文章上 https 的事情。

想直以前搭建个人网站的时候,使用的是宝塔里申请的免费证书。

但现在去看了下,已经没有免费证书可以用了。

于是,我回想起之前发文章的时候,有人在底下评论说 certbot 也是免费,非常推荐

基于 certbot 开发的工具,letscertbot 给网站自动申请/续期/部署免费证书

报着试试看的态度,去尝试了下,没想到发现这货还真不错,值得我写一篇文章来介绍一下它。

这样的感觉真的很好,在我给大家分享的同时,有些读者能够在留言区提供一些意见,有的是独到的见解,有的是更优解,我的读者虽然不是很多,但是每次也有好几千人可能看到,所以希望大家,不要吝啬自己的发言,要多多留言啊。

安装 certbot

以前安装 certbot 有一个叫做 certbot-auto 的脚本工具,但这个工具由于是用 python2 编写的,pythoh2 不维护后,官方也放弃了那些默认使用 python2 为默认 Python 的操作系统。

没有了那个certbot-auto,虽然会麻烦一些,但好在官方给的文档非常全,一般也不会有什么问题,具体可以去官方查看。

下面是我在 CentOS 7.2 上的安装 方法,供你参考。

第一步:安装 snapd,并启动它。

使用 snap 对内核有要求,太老的内核版本无法使用,我的内核版本是 3.10.0-1127.el7.x86_64 供你参考

# https://snapcraft.io/docs/installing-snap-on-red-hat
sudo yum -y install snapd
sudo systemctl enable --now snapd.socket
sudo systemctl start --now snapd.socket
sudo ln -s /var/lib/snapd/snap /snap
sudo snap install core; sudo snap refresh core

第二步:使用 snap 安装 certbot(如果你在此之前有使用系统自带的包管理器安装过 certbot,那么请你先卸载它)

sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

使用 certbot

有了 certbot 就可以用来申请证书、续费证书、部署证书了。

1、申请证书

使用如下 certbot 命令就可以开始证书的申请。以下自动完成申请,需要替换邮箱及自己的域名:

certbot --nginx --agree-tos --redirect \
        -m email@youremail.com --eff-email \
        --preferred-challenges http-01 \
        --cert-name url.com \
        -d url.com,xyz.url.com,www.url.com  -q

前提你得提前安装 nginx (这个自然不用说),安装过了但路径不对的话,需要你建立一个软链接

ln -s /usr/local/nginx/conf/ /etc/nginx

2、续期证书

certbot 的证书有效期是 3个月(准确的说应该是 90 天),这意味着你 3个月就要来处理一下续期。

续期的命令就比较简单了。

certbot renew

难用的 certboot

使用 cerbot 申请证书的时候,有许多交互界面需要你填入各种参数,允许各种协议,体验非常的不好。

并且最主要的是,在证书的申请和续期的过程中,有一步需要验证你对该域名的所有权,因此需要你人工登陆你域名提供商的控制台去添加类型为 txt 的 DNS 记录。

这导致了整个过程非常的繁琐,需要全程人工的界入。

而这繁琐的过程,不仅在你申请证书的时候要来一次,以后续费每次都要重复操作。

虽然各大国内域名提供商提供了 API 接口,可以让开发者调用去管理域名的 DNS 解析。

但 certbot 本身并未实现这个功能,这非常的遗憾。

好用的 letscertbot

但庆幸的是,certbot 的流程中保留了不少的 hook,开发者可以自行实现 DNS 的验证逻辑。

于是乎,就出现了一些有心的开发者,花时间写一些脚本,结合 certbot 来实现更多智能的工作。

在早期,有一个叫做 certbot-letencrypt-wildcardcertificates-alydns-au 在 github 项目,是基于 certbot-auto 的脚本。

之前不知道 certbot-auto 已经废弃了,让我试了半天,一直提示失败。

结果去 issue 上看,很多 issue 都没有处理,作者也已经一年没有在 github 上活跃过了。也许该项目是已经和 certbot-auto 的废弃而告终了。

于是我又开始漫天寻找新的解决方案。

终于让我找到一个叫 letscertbot 的项目。

基于 certbot 开发的工具,letscertbot 给网站自动申请/续期/部署免费证书

使用 letscertbot

使用letscertbot 的方法有两种

  1. 使用容器运行
  2. 使用脚本运行

我这里使用脚本运行演示。

在开始使用之前,你需要拷贝模板配置文件,并进行配置

cp config.json.example config.json

主要配置的项有:

  • base.email:填写你的邮箱,以便接收通知
  • dns.aliyun:填写你的阿里云(如果你用的是阿里云域名的话)的授权id和密钥

阿里云的授权id怎么获取呢?

可前往阿里云的帮助文档:https://help.aliyun.com/knowledge_detail/38738.html

接下来我们就可以:

1、申请证书

申请的证书全部在 /etc/letsencrypt/live/ 目录下

sudo python ./bin/obtain.py -d your.example.com *.your.example.com

2、续费证书

sudo python ./bin/renewal.py

然后你可以将该命令部署到 cron 定时任务中,这个计划任务将每七天天执行 renewal 脚本,但是七天间隔太久,最好加上 --force 参数,强制续期。

0 1 * * * $your_letscertbot_home/bin/renewal.py --force >> /var/log/letscertbot-renewal.log 2>&1

如果你只想续期某个域名,可以加上 --certs 参数:

sudo python ./bin/renewal.py --certs xny.example.com --force

3、部署证书

如果你将 deploy.server.enable 设置为 true, Certbot 将执行 deployment 脚本 (deploy.py) 在 deploy 钩子上。这个脚本接收到已经续期的证书并将它推送到配置好的服务器中。

Let’s Certbot 通过 SSH 为远程服务器部署证书,这意味着你执行 Certbot 的机器须通过 SSH 连接上远程服务器。为了使连接成功,你需要上传公钥到远程服务器或者提供 deploy.server.passwordsshpass 工具。

此外,为了将证书部署到 deploy.server.deploy_to 或重启 nginx, Let’s Certbot 要求 deploy.server.user 有执行对应操作的权限。

你可以通过执行下面命令获取 deployment 脚本:

sudo python ./bin/deploy.py --check

如果需要推送证书到配置中的服务器,可以执行:

sudo python ./bin/deploy.py --push --cert certificate_name --serverserver_host

文章有帮助,请作者喝杯咖啡?

发表评论