SSL证书免费申请-自动续期 Let’s Encrypt 使用教程,告别3个月手动部署的麻烦

热门内容4天前更新 SEOAIDE
109 0 0

在如今的互联网环境下,为网站配置 SSL 证书至关重要,它是保障网站安全的标配操作。而国内目前的免费SSL证书只有三个月的有效期,需要3个月后手动部署,麻烦且一旦忘记部署,对网站的seo和运营是很有影响的,本教程将详细指导你如何利用 Let’s Encrypt 免费获取泛域名 SSL 证书,并实现自动续期,让你的网站安全地通过 HTTPS 加密连接与用户交互。

一、准备工作

在开始操作之前,请确保你已经具备以下条件:
  1. 服务器环境:拥有一台能够访问互联网的服务器,且服务器需为 Linux 环境,例如 Ubuntu 或者 CentOS 系统。
  2. 权限要求:具备 Root 权限或者 sudo 权限,这样才能顺利执行后续的安装、配置等操作。
  3. 域名准备:准备好一个已经解析的域名,在本教程中我们以 seoaide.cn 为例进行讲解说明。

二、了解 Let’s Encrypt

(一)简介

Let’s Encrypt 是一家免费、自动化且开放的证书颁发机构(CA),它旨在助力所有网站轻松达成 HTTPS 加密,切实保障用户数据安全。通过它,你可以为自己的主域名、子域名,甚至泛域名配置安全证书,整个过程高度自动化,无需手动进行繁杂的证书申请和管理工作,官方推荐使用 Certbot 工具来完成相关操作。

(二)证书颁发原理

  1. 域名验证
    在申请证书时,Let’s Encrypt 需要先验证你对所申请域名是否拥有控制权,验证方式主要有以下两种:
    • HTTP-01 验证:Let’s Encrypt 会要求你在网站的指定路径下创建一个特定文件,然后通过访问该文件来确认你是否能控制该域名。不过要注意,对于泛域名证书,这种验证方式无法跨域名层级进行验证,所以不能使用。
    • DNS-01 验证:Let’s Encrypt 会提供一条 DNS TXT 记录,你需要将其添加到域名的 DNS 设置当中,随后它会通过检查 DNS 记录来验证你对域名的控制权。申请泛域名证书时,必须采用这种验证方式。
  2. 证书生成:当域名验证成功后,Let’s Encrypt 会生成一个 SSL 证书,并发放给申请者。该证书包含了公钥以及域名相关信息,凭借这个证书,任何人都可以与你的网站建立安全通信连接。
  3. 证书安装
    • 手动安装:你可以自行手动安装证书,比如当你使用的是 docker 版的 nginx 服务器时,可能就需要手动操作。
    • 自动安装(使用 Certbot):如果你的服务器上已经安装了 Nginx 或者 Apache 等服务器软件,Certbot 能够自动将证书安装到对应的 Web 服务器上,并且配置好相应的加密设置。自动安装更加便捷,不过手动配置会更具灵活性,例如当申请证书和 Web 服务器不在同一台电脑上时,手动配置就很有必要了。
  4. 自动续期:Let’s Encrypt 颁发的证书有效期仅为 90 天,所以需要定期进行续期操作。Certbot 能够自动完成续期验证工作,确保你的网站不会因为证书过期而向用户弹出安全警告信息。

三、Certbot 工具介绍

Certbot 是一个命令行工具,它在整个 SSL 证书管理流程中起着关键的自动化作用,具体功能如下:
  1. 申请证书:运用 ACME 协议从 Let’s Encrypt 获取证书。
  2. 验证域名所有权:通过 HTTP-01 或 DNS-01 验证方式来确认你是否拥有相应域名。
  3. 申请证书:自动将证书安装到你的 Web 服务器上,并配置好相关的加密参数。
  4. 续期证书:定期自动对证书进行续期,有效避免证书过期情况的发生。
Certbot 的核心工作机制是借助 ACME 协议(自动证书管理环境)与 Let’s Encrypt 进行通信,依靠这套标准协议来实现证书申请、验证以及安装等流程的自动化,保障你的网站能够通过安全的 HTTPS 连接进行访问。

四、Certbot 的安装

(一)Linux 系统

推荐使用 Linux 的 snap 包管理工具来安装 Certbot,具体安装命令如下:

sudo snap install --classic certbot #安装Certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot #创建一个符号链接,确保可以执行certbot命令(相当于快捷方式)

(二)其他系统平台

如果是其他系统平台,请参考 Certbot 官网提供的对应安装指南进行操作。
SSL证书免费申请-自动续期 Let’s Encrypt 使用教程,告别3个月手动部署的麻烦

五、单域名 SSL 证书操作(简单了解,方便对比)

(一)申请单域名 SSL 证书

若你仅需为单个域名(例如 seoaide.cn 和 www.seoaide.cn)申请证书,可以执行以下命令(前提是服务器预先安装了 nginx,certbot 获取到证书后会自动通过修改 nginx 的配置将证书安装到 nginx 上):
sudo certbot --nginx -d seoaide.cn -d www.seoaide.cn 
按照提示输入邮箱地址,并同意服务条款后,Certbot 就会自动完成证书的申请与安装工作。

(二)单域名自动续期

由于 Let’s Encrypt 证书有效期为 90 天,为避免证书过期,我们可以借助 Cron Job 来设置自动续期任务,操作步骤如下:
  1. 手动测试续期是否正常
    sudo certbot renew --dry-run

    若没有报错提示,说明续期功能正常,可以继续下一步操作。

  2. 配置自动续期任务
    sudo crontab -e

    在打开的编辑器中添加以下内容,表示每天凌晨 2 点执行自动续期任务(--quiet 参数表示静默模式,执行时不会输出非错误信息):

    0 2 * * * /usr/bin/certbot renew --quiet

六、泛域名 SSL 证书操作(重点内容)

(一)申请泛域名 SSL 证书

泛域名证书(Wildcard Certificate)能够为同一主域名下的所有子域名提供 HTTPS 支持,例如,*.seoaide.cn 可以覆盖像 blog.seoaide.cnapi.seoaide.cn 等众多子域名。

使用 DNS 验证来申请泛域名证书,需运行以下命令:

sudo certbot certonly --manual --preferred-challenges dns -d *.seoaide.cn -d seoaide.cn
Certbot 会要求你在 DNS 中创建一个特定的 TXT 记录来验证域名的所有权,格式如下:
_acme-challenge.seoaide.cn  IN  TXT  "certbot给出的随机字符串"

接着,前往你的域名 DNS 管理页面,添加上述记录后,返回命令行按下 Enter 键。大概等待几十秒钟,确保 DNS 记录在全网传播开来,以便 Certbot 可以查询到。Certbot 在执行验证时会发起 DNS 查询,如果能找到所需的 TXT 记录并验证其值准确无误,认证就会成功,随后便会颁发证书。证书颁发后,这条 TXT 记录就可以删除了。这里只是为了演示 Certbot 颁发证书的过程而采用手动添加删除 DNS 对应的 TXT 记录方式,实际应用中,最好采用自动化脚本添加和删除 DNS 的 TXT 解析记录。

(二)泛域名设置自动续期

因为 Let’s Encrypt 颁发的 SSL 证书有效期为 90 天,为防止证书过期导致网站 HTTPS 连接中断,自动续期配置必不可少。对于泛域名证书,由于采用了 DNS-01 验证方式,所以我们需要借助相应的自动化脚本来管理 DNS TXT 记录,进而实现自动续期功能。以下以腾讯云 DNSPod 的 API 为例,介绍具体配置步骤:
  1. 创建自动化 DNS 脚本
    首先,编写两个脚本用于处理 DNS-01 验证过程中的 DNS 记录添加和删除操作。假设你已经安装了腾讯云 CLI 工具 (tccli),以下是 dnspod.sh 脚本的内容(tccli 安装和使用参考腾讯云 CLI 工具相关文档):
    #!/bin/bash
     
    RECORD_FILE="/tmp/_acme-challenge.${CERTBOT_DOMAIN}_${CERTBOT_VALIDATION}"
     
    if! command -v tccli >/dev/null; then
        echo "TCCLI is required: https://cloud.tencent.com/document/product/440" 1>&2
        exit 1
    fi
     
    if [ "$1" = "clean" ]; then
        # 删除 DNS TXT 记录
        RECORD_ID=$(cat ${RECORD_FILE})
        if [ -n "${RECORD_ID}" ]; then
            tccli dnspod DeleteRecord --cli-unfold-argument \
                --Domain ${CERTBOT_DOMAIN} \
                --RecordId ${RECORD_ID} \
                >/dev/null
        fi
        rm -f ${RECORD_FILE}
    else
        # 创建 DNS TXT 记录
        RECORD_ID=$(
            tccli dnspod CreateRecord --cli-unfold-argument \
                --Domain ${CERTBOT_DOMAIN} \
                --SubDomain _acme-challenge \
                --RecordType TXT \
                --RecordLine 默认 \
                --Value ${CERTBOT_VALIDATION} \
                --TTL 600 \
            | grep "RecordId" | grep -Eo "[0-9]+"
        )
        echo ${RECORD_ID} > ${RECORD_FILE}
        sleep 20 # 等待 DNS 记录传播
    fi
    脚本中涉及到的一些环境变量(如 CERTBOT_DOMAINCERTBOT_VALIDATION 等),是由 certbot 自动传递给这些脚本的。详细内容可参考 Certbot DNS 验证前后的钩子相关资料。
  2. 配置自动续期命令
    使用 certbot 的 --manual-auth-hook 和 --manual-cleanup-hook 参数,调用 dnspod.sh 脚本来自动添加和清理 DNS 记录,配置命令如下:
    certbot renew --manual --preferred-challenges=dns \
        --manual-auth-hook "/path/to/dnspod.sh" \
        --manual-cleanup-hook "/path/to/dnspod.sh clean" \
        --deploy-hook "/path/to/renew_and_reload_nginx.sh"
    各参数含义如下:
    • --manual-auth-hook:在验证开始时调用,用于创建 DNS TXT 记录。
    • --manual-cleanup-hook:在验证结束后调用,用于清理 DNS TXT 记录。
    • --deploy-hook:在证书更新成功后调用,用于重启并加载 Nginx 最新配置。
  3. 置 Crontab 定期续期任务
    编辑 Crontab 文件,添加以下内容,实现每 10 天凌晨 2 点自动尝试续期证书(执行任务产生的日志会被重定向到 /var/log/certbot-renew.log,方便后续检查和调试):
    0 2 */10 * * root certbot renew --manual --preferred-challenges=dns \
        --manual-auth-hook "/path/to/dnspod.sh" \
        --manual-cleanup-hook "/path/to/dnspod.sh clean" \
        --deploy-hook "/path/to/renew_and_reload_nginx.sh" >> /var/log/certbot-renew.log 2>&1
  4. 重载 Nginx 配置
    以下是 renew_and_reload_nginx.sh 的内容,用于在证书续期后重启 Nginx 服务(假设使用 Docker 运行 Nginx):
    #!/bin/bash
     
    # 停止 nginx 服务
    docker compose -f /path/to/compose.yml stop nginx
     
    # 重新启动 nginx 服务
    docker compose -f /path/to/compose.yml up -d nginx
  5. 验证自动续期配置
    完成上述配置后,可以运行以下命令来测试续期流程是否正常:
    certbot renew --manual --preferred-challenges=dns --manual-auth-hook "/path/to/dnspod.sh" --manual-cleanup-hook "/path/to/dnspod.sh clean" --deploy-hook "/path/to/renew_and_reload_nginx.sh" --dry-run

    若没有错误提示,就说明自动续期配置成功(加上 --dry-run 参数表示使用 Let’s Encrypt 的测试服务器,可防止多次使用真实服务器频繁颁发证书达到速率限制)。

七、深入解读关键环节

(一)DNS 验证和自动化挑战

泛域名证书使用 DNS-01 验证方式,也就是要求在 DNS 中添加 _acme-challenge 的 TXT 记录,通过这种方式来验证你对整个域名的控制权。使用 API 自动管理 DNS 记录,能够避免手动操作添加和删除 TXT 记录的繁琐流程,更适合生产环境中的自动化需求。

(二)Crontab 定时任务

鉴于 Let’s Encrypt 证书有效期为 90 天,我们配置 Crontab 每 10 天尝试续期一次,以此确保在证书到期之前顺利完成续期工作,同时任务执行产生的日志会按照设定被重定向保存,便于后续查看和调试问题。

(三)Nginx 重载

证书续期后,需要重新加载 Nginx 配置,这样新的证书才能生效。对于通过 docker compose 管理的 Nginx 服务,可以使用 up -d 命令实现无中断重启,保障网站服务的连续性。

八、配置完成后的效果检查

完成上述一系列配置后,你的服务器就能自动管理泛域名 SSL 证书了,它会定期进行续期并自动应用新的证书配置,极大地减轻了证书管理的工作量,同时确保网站的 HTTPS 加密连接始终保持有效状态。

你可以随时使用以下命令检查现有证书的状态:

sudo certbot certificates

如果证书信息显示正确,并且 expiry date(有效期截止日期)显示在未来日期,那就说明配置成功了。

九、SSL 证书文件所在目录及查看证书详细信息

(一)证书文件存放位置

当使用 Certbot 成功申请到 SSL 证书后,证书文件默认会保存在以下目录中:

/etc/letsencrypt/live/your-domain-name/
该目录下具体包含以下几个重要文件:
  1. cert.pem:这是你的 SSL 证书文件。
  2. privkey.pem:这是你的私钥文件,务必妥善保管,千万不能泄露出去。
  3. chain.pem:这是中间证书链文件,用于验证证书的完整性。
  4. fullchain.pem:这是完整证书链文件,通常在 Nginx 或 Apache 的 SSL 配置中会用到它。

例如,如果你的域名是 seoaide.cn,那么对应的目录路径就是:

/etc/letsencrypt/live/seoaide.cn/

你也可以使用以下命令查看证书详细信息:

sudo certbot certificates

命令输出示例如下:

Certificate Name: seoaide.cn
    Domains: seoaide.cn www.seoaide.cn
    Expiry Date: 2024-02-10 14:30:00+00:00 (VALID: 75 days)
    Certificate Path: /etc/letsencrypt/live/seoaide.cn/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/seoaide.cn/privkey.pem
为避免证书路径出现错误,建议在 Nginx 或 Apache 配置中直接使用 fullchain.pem 和 privkey.pem 这两个文件。

(二)nginx 配置证书示例

以下是一个简单的 nginx 配置示例,展示如何配置证书相关信息(这里分别针对 HTTP 和 HTTPS 配置了不同的 server 块):

server {
    listen 80;
    server_name seoaide.cn www.seoaide.cn;
 
    location / {
        return 301 https://$host$request_uri;
    }
}
 
server {
    listen 443 ssl;
    server_name seoaide.cn www.seoaide.cn;
 
    ssl_certificate /etc/letsencrypt/live/seoaide.cn/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/seoaide.cn/privkey.pem;
 
    location / {
        proxy_pass http://127.001:8080;
    }
}
如果使用 docker nginx,可以通过 docker 挂载卷的方式来使用证书,示例 compose.yml 和对应的 nginx 配置文件内容如下:

compose.yml

services:
  nginx:
    image: nginx:latest
    networks:
     - spy
    ports:
      - "80:80"
      - "443:443"
    environment:
      - TZ=Asia/Shanghai # 设置为上海时区
    volumes:
    # 主配置
      -./nginx/nginx.conf:/etc/nginx/nginx.conf:rw 
    # include配置
      -./nginx/conf.d/:/etc/nginx/conf.d/:rw
    # 证书
      - /etc/letsencrypt/live/seoaide.cn/fullchain.pem:/etc/ssl/certs/seoaide.cn/fullchain.pem:rw

 

© 版权声明

相关文章

暂无评论

暂无评论...