关于 Let’s Encrypt 证书相关的教程。
注:这篇文章是从旧的博客系统中迁移过来的、我觉得还存在价值的文章。但是由于时间关系,可能已经不再是最佳实践,请仅作参考。
腾讯云虽然免费提供诚信亚洲的 SSL 证书申请,但是一年一申请还是有些麻烦,再加上只是给边缘项目域名加上 HTTPS 防止前端引用资源的时候报不安全,稍微折腾一下一劳永逸感觉会更方便一点,这样在后续的其他项目也能直接用。
教程的顺序为我自己操作的顺序:
申请证书 → 配置 Nginx HTTPS 访问和放行 HTTP 下的证书路由 → 自动续签证书配置
1、首先申请证书
由于我使用的是 CentOS7 系统,因此可以 yum 直接安装 Certbot:
yum -y install certbot
虽然一般教程接下来都是直接执行如下命令申请证书(example.com 替换为你自己的域名,也可是二级域名)
certbot certonly --webroot --agree-tos -v -t --email example@gmail.com -w /usr/share/nginx/ -d example.com
但是还是有几点需要在执行之前确认:
- 防火墙和安全组放行 80 端口(后续配置 HTTPS 访问再自行放行 443 端口)
- 确保 example.com 域名已经解析到了你在申请证书的服务器 IP 上
- 确保 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 天以后回来记录下自动续签是否生效。