网站的https证书过期了,一直使用阿里云的免费ssl证书,但是现在阿里云调整了策略,证书有效期从1年缩短到3个月了,所以我决定放弃阿里云转而使用 Let’s Encrypt 申请免费证书。

简介

Let’s Encrypt 是一家免费、开放、自动化的公益性证书颁发机构(CA), 由互联网安全研究组(ISRG)运作,详细介绍可以看这里

申请证书

按照官方文档,对于没有命令行访问权限的网站,比如wordpress、cPanel等,可以通过控制台设置或者申请后手动上传证书;而我的网站服务器托管在阿里云,拥有命令行访问权限,所以直接使用官方推荐的 Certbot ACME 客户端来管理证书,这里详细记录下步骤。

CertBot 文档有详细的安装步骤,我的 ubuntu14 上的步骤如下:

安装 snapd

snap 是linux的应用程序包,可以从其自身的snap store中安装、管理软件,有点类似包管理器如 apt、yum,但是不依赖linux发行版,安全、跨平台且无依赖;而 snapd 则是一个自动管理和维护 snap 的后台服务,它们之间的区别请参阅官方文档

Ubuntu 16.04LTS版及之上的版本已经集成了snapd,无需再安装了,而我的是 14,所以需要手动安装。

sudo apt update
sudo apt install snapd

测试是否安装成功,可以安装官方的 hello-world 程序:

$ snap install hello-world
2024-06-09T16:15:39+08:00 INFO Waiting for automatic snapd restart...
hello-world 6.4 from Canonical✓ installed

执行并成功输出信息表示安装成功:

$ hello-world
Hello World!

删除 certbot-auto 和任何 Certbot OS 软件包

如果您使用操作系统包管理器(如 apt 、 dnf 或 yum 安装了任何 Certbot 包,则应在安装 Certbot snap 之前删除它们,以确保运行命令 certbot 时,将使用 snap,而不是从操作系统包管理器进行安装。执行此操作的确切命令取决于您的操作系统,但常见的示例是 sudo apt-get remove certbot 、 sudo dnf remove certbot 或 sudo yum remove certbot 。

Ubuntu 14上并没有安装 certbot-auto:

$ apt-get remove certbot
Reading package lists... Done
Building dependency tree
Reading state information... Done
Package 'certbot' is not installed, so not removed
……
0 upgraded, 0 newly installed, 0 to remove and 260 not upgraded.

安装 Certbot

ok,现在可以使用 snap 安装 Certbot 了:

$ snap install --classic certbot
certbot 2.11.0 from Certbot Project (certbot-eff✓) installed

然后,做一个软件链接方便执行:

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

获取并安装证书

这是最简单的方式,直接执行 certbot 申请证书并自动安装到 nginx:

$ certbot --nginx
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
……

这期间会询问多次,主要是输入邮箱地址、同意协议、根据nginx已经配置的域名来选择需要启用https证书的域名等,最后安装成功会输入如下信息:

Congratulations! You have successfully enabled HTTPS on https://hankmo.com, https://bitcoinbook.hankmo.com, https://jason.hankmo.com, and https://jimmy.hankmo.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

如果nginx没有准备好,仍然可以手动获取证书,后续再手动配置:

sudo certbot certonly --nginx

测试自动续订

您系统上的 Certbot 软件包附带一个 cron 作业或 systemd 计时器,可在证书过期之前自动更新您的证书。您不需要再次运行 Certbot,除非您更改配置。您可以通过运行以下命令来测试证书的自动续订:

sudo certbot renew --dry-run

续订 certbot 的命令安装在以下位置之一:

  • /etc/crontab/
  • /etc/cron.*/*
  • systemctl list-timers 比如我的机器上timer如下:
$ systemctl list-timers
NEXT                         LEFT         LAST                         PASSED    UNIT                         ACTIVATES
Mon 2024-06-10 05:28:00 CST  12h left     Sun 2024-06-09 16:31:32 CST  46min ago snap.certbot.renew.timer     snap.certbot.renew.service

检查证书是否已经生效

现在,访问网站,可以看到证书已经生效,说明证书安装成功。

总结

Let’s Encryot 是一个免费颁发https证书的组织,它提供了 Certbot 工具方便地为我们申请、安装证书,不过它需要使用 snap 来安装,整个过程其实比较简单,完成后您的网站就可以通过 https 访问了。

参考:

  1. Let’s Encrypt 官方文档: https://letsencrypt.org/zh-cn/getting-started/
  2. Certbot 官方文档: https://certbot.eff.org/instructions?ws=nginx&os=ubuntuxenial
  3. snap 官方安装文档: https://snapcraft.io/docs/installing-snapd

相关阅读