网站的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 访问了。
参考:
- Let’s Encrypt 官方文档: https://letsencrypt.org/zh-cn/getting-started/
- Certbot 官方文档: https://certbot.eff.org/instructions?ws=nginx&os=ubuntuxenial
- snap 官方安装文档: https://snapcraft.io/docs/installing-snapd