一卓的博客

怕什么真理无穷,
进一寸有一寸的欢喜。

0%

使用免费的 Https 证书 Let's Encrypt

想使用 https 需要认证机构颁发的电子证书。本文介绍一个免费的 https 的证书 Let’s Encrypt。

Let’s Encrypt 和其他认证机构的区别:

  • 免费,Let’s Encrypt 提供期限是90天的免费电子证书
  • 提供工具 certbot 自动生成电子证书文件

Let’s Encrypt 证书不仅是免费的,而且支持通配符证书,通配符证书指的是一个可以被多个子域名使用的公钥证书,多个子域名使用起来十分方便。申请和配置的流程都非常简单,虽然每次的有效期为 90 天,但可以通过脚本去更新证书,只要配置好了,几乎可以一劳永逸。

本文使用的环境

  • Ubuntu 20.04 LTS
  • nginx 1.19.1

Certbot 官网:

选择 WEB 服务器版本,系统版本,然后按指引一步步执行脚本即可。

简单来说分为如下几步:

第一步:安装 certbot

安装 certbot 之前要保证服务器已安装了 snapd, 由于本文使用的为 ubuntu 20.04 版本,需先安装 snapd,执行以下命令:

1
2
$ sudo apt update
$ sudo apt install snapd

安装完成后测试是否安装成功:

1
2
3
4
$ sudo snap install hello-world
hello-world 6.4 from Canonical✓ installed
$ hello-world
Hello World!

如果系统已经安装了 snapd,需更新 snapd 至最新版,执行以下命令

1
$ sudo snap install core; sudo snap refresh core

安装 certbot,执行以下命令

1
$ sudo snap install --classic certbot

准备 certbot 命令,执行以下命令,确保可以运行 certbot 命令:

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

第二步:生成证书,certbot 提供如下两种方式:

第一种 可自动编辑 nginx 配置

1
$ sudo certbot --nginx

第二种 仅获得证书,需手动修改 nginx 配置

1
$ sudo certbot certonly --nginx

因为服务器上使用的 nginx 为 docker 容器运行,本文使用的为第二种方式。

先确保服务器上已经正常运行了 nginx ,并且可以正常访问。

执行如下命令

1
$ sudo certbot certonly --nginx

证书生成成功将会输出如下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
MPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/yourwebsite.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/yourwebsite.com/privkey.pem
Your cert will expire on 2021-01-01. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew *all* of your certificates, run
"certbot renew"
- 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 的配置文件 新增 ssl 相关配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server{
listen 80;
server_name yourwebsite.com;
rewrite ^(.*)$ https://${server_name}$1 permanent;
}
server {
listen 443;
server_name yourwebsite.com;
# ssl 配置,需将此处的 ssl_certificate 和 ssl_certificate_key 路径改为你自身的证书及密钥路径
# docker 容器运行的 nginx 此处需将服务器证书路径映射至容器内路径,并在此配置 docker 容器内证书路径
ssl on;
ssl_certificate /usr/local/nginx/ssl/fullchain.pem;
ssl_certificate_key /usr/local/nginx/ssl/privkey.pem;
index index.html index.htm index.php index.jsp;
charset utf-8;
location / {
...
}
}

如果是 docker 容器运行的 nginx ,则需额外配置挂载卷:

1
2
3
4
volumes:
- ./logs:/usr/local/nginx/logs
- ./config/ssl:/usr/local/nginx/ssl
- ./config/nginx.conf:/etc/nginx/nginx.conf

第三步:重启 nginx 使配置生效。

自动续订证书

系统上的 Certbot 软件包带有 cron 作业或 systemd 计时器,它们将在证书过期之前自动更新证书。除非更改配置,否则无需再次运行 Certbot。可以运行以下命令测试证书的自动续订

1
sudo certbot renew --dry-run

如果需要手动更新证书,则仅需再次执行 sudo certbot certonly --nginx 命令,按步骤操作即可。

请作者喝杯咖啡吧