Featured image of post SSL证书

SSL证书

ssl证书配置及自动续签

之前都是使用腾讯云和阿里云的免费证书,但是到期重新弄还是很麻烦,所以使用 Let’s Encrypt 来部署并开启自动续签


之前都是使用腾讯云和阿里云的免费证书,一次一年的期限,虽然弄起来很方便,但是网站有点多,到期都要重新弄有点麻烦,就考虑使用 Let’s Encrypt 来部署,虽然每次签只有 90 天的有效期,但可以通过自动续签来解决每次需要手动部署的麻烦。

安装Certbot

利用 Cerbot 这个工具来获取证书,并定期更新证书。Certbot 是一款功能全面并且容易使用的工具,可自动完成获取和更新 Let’s Encrypt SSL证书。Certbot 已经在 Ubuntu20.04 的软件库里,所以我们可以直接运行以下命令进行安装:

1
2
sudo apt update
sudo apt install certbot

获取Let’s Encrypt SSL 证书

获取自签 SSL 证书,使用 Cerbot 及插件 webroots 来获取 SSL 证书文件:

1
certbot certonly --webroot -w /var/www/example -d example.com -d www.example.com

这个命令会为 example.comwww.example.com 这两个域名生成一个证书,使用 --webroot 模式会在 /var/www/example 中创建 .well-known 文件夹,这个文件夹里面包含了一些验证文件,certbot 会通过访问 example.com/.well-known/acme-challenge 来验证你的域名是否绑定的这个服务器,这个命令在大多数情况下都可以满足需求。

但是有些时候我们的一些服务并没有根目录,例如一些微服务,这时候使用 --webroot 就走不通了。certbot 还有另外一种模式 --standalone , 这种模式不需要指定网站根目录,他会自动启用服务器的 443 端口,来验证域名的归属。我们有其他服务(例如 nginx)占用了 443 端口,就必须先停止这些服务,在证书生成完毕后,再启用。

1
certbot certonly --standalone -d example.com -d www.example.com

执行完成就拥有域名的SSL证书了,存放在 /etc/letsencrypt/live/ 里面。接下来编辑我们域名的Nginx配置文件,示例如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
server {
    server_name example.com www.example.com;
    listen 443;
    ssl on;
    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:3999;
        proxy_http_version 1.1;
        proxy_set_header X_FORWARDED_PROTO https;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
    }
}

完成后打开浏览,以https://访问你的域名,如果地址栏的加密锁完好不报错,证明你已成功部署。你也可以通过SSL证书测试网站来验证。

自动更新 SSL 证书

配置完成后,我们还需要配置自动更新这些证书,因为 Let’s Encrypt 提供的证书只有90天的有效期。使用 certbot renew 来自动检查系统内的证书,并且自动更新这些证书。 我们可以运行这个命令测试一下

1
certbot renew --dry-run

如果运行报错

1
Attempting to renew cert from /etc/letsencrypt/renewal/api.example.com.conf produced an unexpected error: At least one of the required ports is already taken.. Skipping.

这是因为 api.example.com 生成证书的时候使用的是 --standalone 模式,验证域名的时候,需要启用443端口,这个错误的意思就是要启用的端口已经被占用了。 这时候我必须把nginx先关掉,才可以成功。所以需要先运行 service nginx stop 运行这个命令。

接下来通过 cron 来自动更新证书。 sudo vim /etc/cron.d/certbot 新建一个文件 certbot, 这个是一个 cron 计划,内容如下:

1
15 2 * */2 * certbot renew --pre-hook "service nginx stop" --post-hook "service nginx start"

这段内容的意思就是 每隔 两个月的 凌晨 2:15 执行 更新操作。--pre-hook 这个参数表示执行更新操作之前要做的事情,因为我有 --standalone 模式的证书,所以需要停止 nginx 服务,解除端口占用。 --post-hook 这个参数表示执行更新操作完成后要做的事情,这里就恢复 nginx 服务的启用

最后我们用 crontab 来启动这个定时任务:

1
crontab certbot

ref https://diamondfsd.com/lets-encrytp-hand-https/

VPROMISE ALL RIGHT RESERVED