Let's Encrypt 证书的申请、自动更新和 Nginx 的配置

腾讯云虽然免费提供诚信亚洲的 SSL 证书申请,但是一年一申请还是有些麻烦,再加上只是给边缘项目域名加上 HTTPS 防止前端引用资源的时候报不安全,稍微折腾一下一劳永逸感觉会更方便一点,这样在后续的其他项目也能直接用。


教程的顺序为我自己操作的顺序:
申请证书 → 配置 Nginx HTTPS 访问和放行 HTTP 下的证书路由 → 自动续签证书配置

1、首先申请证书,由于我使用的是 CentOS7 系统,因此可以 yum 直接安装 Certbot:

yum -y install certbot

虽然一般教程接下来都是直接执行如下命令申请证书(example.com 替换为你自己的域名,也可是二级域名)

certbot certonly --webroot --agree-tos -v -t --email [email protected] -w /usr/share/nginx/ -d example.com

但是还是有几点需要在执行之前确认:

  1. 防火墙和安全组放行 80 端口(后续配置 HTTPS 访问再自行放行 443 端口)
  2. 确保 example.com 域名已经解析到了你在申请证书的服务器 IP 上
  3. 确保 Nginx 配置无误,指:http://example.com/.well-known/acme-challenge/ 下临时生成的认证文件可以被访问到。

2、Nginx 的配置可以像我下面这样(我选的验证文件临时目录为 /usr/share/nginx,server_name 等可以自行替换):

server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        # Let's Encrypt 证书认证(优先级最高放在最前面)
        location ~ /.well-known {
            root /usr/share/nginx;
            allow all;
        }
    }

在配置好后重启 Nginx:

nginx -s reload
service nginx restart

然后执行上面证书申请的命令应该就可以申请到了,任何错误请依次确认上述 3 点事项。
注:如果使用的是 Cloudflare DNS 解析,请在 SSL/TLS 处选为灵活模式,以防止强制 HTTPS 转换导致的文件无法验证。
证书申请成功

3、证书自动续签。
Certbot 提供了方便的一键续签命令:

certbot renew

在证书到期时间小于 30 天的情况下,执行以上指令后会在原位置更新证书,接下来只要手动 Nginx 重新加载配置并重启就能使用新的证书了。
Certbot 很贴心的提供了钩子,以方便在 renew 操作前后执行其他命令,于是便可以直接使用下面的命令同时完成续签和重启 Nginx 操作:

certbot renew --pre-hook "service nginx stop" --post-hook "service nginx start"

接着以官方建议的每天 2 次频率将其加入到任务计划中:

crontab -e
...
# 每 12 小时执行一次
0 */12 * * * certbot renew --pre-hook "service nginx stop" --post-hook "service nginx start"
...
service crond restart

理论上是没问题的,大概 60 天以后回来记录下自动续签是否生效。

2021/07/17
todo…