Ubuntu自动更新ssl证书

Table of Contents

  使用 Let's EncryptCertbot 来自动更新 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),通过这种方式,即可自动签发,无效多余配置

Date: 2024-05-06 一 11:28