Ubuntu自动更新ssl证书
Table of Contents
使用 Let's Encrypt 的 Certbot 来自动更新 Ubuntu 系统下的 Nginx SSL 证书。
1. 安装 Snapd :
通过 Snapd 来安装 Certbot ,因为 Snapd 能保证你获取到最新的版本。如果你的系统上没有 Snapd ,你需要先安装它。
sudo apt update sudo apt install snapd sudo snap install core; sudo snap refresh core
2. 安装 Certbot :
使用snap来安装Certbot:
sudo snap install --classic certbot
3. 准备 Certbot 运行:
确保Certbot命令可以通过一个简单的符号链接运行:
sudo ln -s /snap/bin/certbot /usr/bin/certbot
4. 获取并安装 SSL 证书:
用Certbot为Nginx获取并安装一个SSL证书。记得将 justf.fun
替换成你实际的域名,并且确保在DNS中这个域名是指向你的服务器IP的。
sudo certbot --nginx -d justf.fun -d www.justf.fun -d blog.justf.fun
4.1 下载的 SSL 地址
Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/justf.fun/fullchain.pem Key is saved at: /etc/letsencrypt/live/justf.fun/privkey.pem This certificate expires on 2024-08-04. These files will be updated when the certificate renews. Certbot has set up a scheduled task to automatically renew this certificate in the background.
4.2 替换nginx配置的SSL地址
ssl_certificate /etc/letsencrypt/live/justf.fun/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/justf.fun/privkey.pem;
5. 自动续期:
Certbot Snap版本会自动设置一个系统任务(Timer),这个Timer会两次一天来运行续期操作。你不需要手动创建cron job。你可以通过以下命令检查Timer的激活状态:
sudo systemctl list-timers | grep certbot
5.1 返回结果
Mon 2024-05-06 23:09:00 CST 11h left n/a n/a snap.certbot.renew.timer snap.certbot.renew.service
6. 测试自动续签:
sudo certbot renew --dry-run
6.1 返回结果
$ sudo certbot renew --dry-run Saving debug log to /var/log/letsencrypt/letsencrypt.log - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Processing /etc/letsencrypt/renewal/justf.fun.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Account registered. Simulating renewal of an existing certificate for justf.fun - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Congratulations, all simulated renewals succeeded: /etc/letsencrypt/live/justf.fun/fullchain.pem (success) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
如果在测试中没有遇到错误,说明自动续签已正确设置。
2024-12-11 三 17:19:49
若要申请通配符证书:
- 使用Certbot申请通配符证书,只能通过ACME v2协议,并且只能使用DNS-01验证方式。以下命令将申请 *.justf.fun 的通配符证书:
sudo certbot certonly -d "*.justf.fun" --manual --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory
- 根据提示,需要在dns运营上那里添加一个TXT记录
- 添加完TXT记录之后,点击回车,即可
手动设置 DNS TXT 记录
获取当前需要的 TXT 记录值:
在 Certbot 执行过程中,脚本会暂停并显示如下信息:
markdown
Please deploy a DNS TXT record under the name:
_acme-challenge.justf.fun.
with the following value:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
手动添加 TXT 记录:
登录域名控制台(如阿里云、Cloudflare 等),添加以下记录:
类型: TXT
主机名: _acme-challenge.justf.fun
值: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX(Certbot 提示的值)
等待 DNS 生效:
使用以下命令检查 TXT 记录是否生效:
dig -t txt _acme-challenge.justf.fun +short
自动申请通配符证书
- 相对手动申请,自动申请更方便,但是流程过于麻烦,依赖项太多,不太稳定,所以,暂时不考虑
手动触发续订:
sudo certbot renew --dry-run
查看证书详情:
sudo certbot certificates
重新安装
步骤 1:卸载旧版 Certbot
# 移除旧版本(APT 安装) sudo apt remove certbot # 移除旧版本(Snap 安装) sudo snap remove certbot
步骤 2:安装最新版 Certbot 和 Nginx 插件
# 通过 Snap 安装(推荐) sudo snap install --classic certbot sudo ln -s /snap/bin/certbot /usr/bin/certbot # 安装 Nginx 插件 sudo snap set certbot trust-plugin-with-root=ok sudo snap install certbot-dns-nginx
Q:为什么通配符域名 *.justf.fun 对 域名justf.fun 不生效
答:通配符证书 *.justf.fun 仅匹配同级子域名(如 a.justf.fun、b.justf.fun),但不包含根域名 justf.fun。若希望证书同时支持 justf.fun 和 *.justf.fun,需在申请证书时明确指定两者。
1. 生成证书时包含根域名
使用 Let's Encrypt 申请证书时,需通过以下方式同时包含根域名和通配符:
sudo certbot certonly \ --manual \ --preferred-challenges=dns \ -d justf.fun \ -d *.justf.fun
关键点:
- 必须使用 –manual 和 –preferred-challenges=dns:通配符证书仅支持 DNS 验证。
- 添加 -d justf.fun:显式包含根域名,否则证书不覆盖它。
2. 配置 DNS 解析验证
在证书申请过程中,根据提示在域名解析商处添加 TXT 记录,等待 DNS 生效(通常 1-5 分钟),验证通过后证书会自动签发。
_acme-challenge.justf.fun. TXT "随机生成的验证值"
2.1 查看是否生效
dig -t txt _acme-challenge.justf.fun +short
3. 检查证书内容
openssl x509 -in /etc/letsencrypt/live/justf.fun/fullchain.pem -text -noout | grep justf.fun
输出应显示:
Subject: CN = justf.fun DNS:*.justf.fun, DNS:justf.fun
4. 配置 Nginx
在 Nginx 配置中,确保同时引用根域名和通配符:
server { listen 443 ssl; server_name justf.fun www.justf.fun; ssl_certificate /etc/letsencrypt/live/justf.fun/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/justf.fun/privkey.pem; # 其他配置... } server { listen 443 ssl; server_name *.justf.fun; ssl_certificate /etc/letsencrypt/live/justf.fun/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/justf.fun/privkey.pem; # 其他配置... }
小结:
- 生成通配符证书时包含根域名,这样根域名和子域名就可以使用同一个证书了。
- 由于通配符证书只支持 dns方式签发证书
- 自动:需要依赖项太多(python插件,nginx配合,TXT域名解析),关健也不稳定。
- 手动:TXT域名解析
- 单域名证书,可以采用http方式签发(sudo certbot –nginx -d blog.justf.fun),通过这种方式,即可自动签发,无效多余配置