使用 Certbot 申请泛域名证书并不复杂,几个月前搞过,但是又忘了,今天重新搞了一遍,记录一下步骤。

前提条件

  1. 你需要有一个域名,并且可以管理该域名的 DNS 记录。

一般我们都是在 阿里云火山引擎 等云服务商购买的域名,这里以阿里云为例。

申请泛域名证书

安装 Certbot

先用 certbot --version 检查是否已经安装 Certbot,如果没有安装,下面一句话安装一下:

sudo apt install certbot -y

申请证书

泛域名证书需要通过 DNS-01 验证域名所有权,使用以下命令申请,注意将 *.cassdev.comcassdev.com 替换为你的域名,example@google.com 替换为你的邮箱。

笔记

什么是 DNS-01 验证?

DNS-01 验证是通过在域名的 DNS 记录中添加一个特定的 TXT 记录来证明你对该域名的所有权。Certbot 会生成这个 TXT 记录的值,你需要将其添加到你的 DNS 提供商的管理控制台中。N

为什么需要验证?

这是为了确保只有域名的合法所有者才能申请和使用该域名的 SSL/TLS 证书,从而防止恶意用户冒充域名所有者获取证书。

certbot certonly --manual --preferred-challenges dns -d "*.cassdev.com" -d "cassdev.com" --email example@google.com --agree-tos

命令执行后会返回一个字符串,先别急着回车,需要先将该字符串添加到你的域名的 DNS 记录中。

certbot-dns-01

添加 DNS 记录

去到域名控制台,找到 DNS 解析,添加一个 TXT 记录, 将上一步返回的字符串复制到 TXT 记录的值中,主机记录填写 _acme-challenge

阿里云的用户请点击跳转:阿里云云解析 DNS

add-txt-record

等待 DNS 记录生效

如命令返回的提示所言,添加完 TXT 记录后,需要等待一段时间让 DNS 记录生效。

我们可以访问 https://toolbox.googleapps.com/apps/dig/#TXT/_acme-challenge.yourdomain.com 来检查你的域名的 acme-challenge TXT 记录是否生效。

注意将 yourdomain.com 替换为你的域名。

记录生效后,回到命令行按回车继续。成功的话可以看到如下提示:

success-tip

查找证书文件

证书文件默认存放在 /etc/letsencrypt/live/yourdomain.com/ 目录下,里面包含以下文件:

  • fullchain.pem:包含服务器证书和中间证书的文件,通常用于配置服务器。
  • privkey.pem:私钥文件,必须妥善保管,不能泄露给他人。

至此,泛域名 SSL 证书申请完成,可以在服务器上配置使用了。

证书续期

泛域名证书的过期时间为 90 天,不过 Certbot 提供了自动续期功能,可以通过以下命令手动续期:

certbot renew

我相信没人想每三个月手动续期一次,所以建议使用 cron 定时任务来自动续期证书。

编辑 crontab 文件:

crontab -e

添加以下内容,每三个月的第一天凌晨 3 点执行续期命令,续期成功后重载 Nginx 配置:

0 3 1 */3 * certbot renew --quiet --post-hook "nginx -s reload"

简单解释一下这个 cron 表达式:

命令
031*/3*certbot renew –quiet –post-hook “nginx -s reload”

Nginx 使用泛域名证书示例

下面是一个 Nginx 配置示例,假设你的泛域名是 *.cassdev.com,你想为子域名 abcd.cassdev.com 配置 SSL:

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name abcd.cassdev.com;

    # SSL 证书路径
    ssl_certificate /etc/letsencrypt/live/cassdev.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/cassdev.com/privkey.pem;

    # 前端静态文件根目录 (请修改为您的实际路径)
    root /var/www/abcd.cassdev.com;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html;
    }

    # 您可以添加其他配置,例如日志、gzip压缩等
    access_log /var/log/nginx/abcd.access.log;
    error_log /var/log/nginx/abcd.error.log;
}