欢迎光临
我们一直在努力

Certbot 申请SSL证书的三种方式详解(Ubuntu 22.04环境)

服务器上配置SSL证书,Certbot是最常用的工具。根据你的服务器环境和应用类型,Certbot提供了多种申请方式。本文将详细介绍三种最主流的方式:–standalone、–webroot和DNS插件方式,重点说明它们的工作原理、适用场景以及最关键的问题——是否需要停止Nginx,80端口如何处理。

1.1 安装Certbot

apt install certbot -y

#验证是否安装

certbot –version

二、Standalone模式

2.1 工作原理

Standalone模式是Certbot最直接的申请方式。在这种模式下,Certbot会启动一个自己的临时Web服务器来响应Let's Encrypt的验证请求。这个临时服务器会占用80端口(HTTP)

也就是说如果你的Nginx占用了80端口,那么需要先停止Nginx

# 如果Nginx在运行,需要先停止 例如你设置了80重定向到443
sudo systemctl stop nginx

# 确认80端口未被占用
sudo netstat -tlnp | grep :80

当然防火墙或者安全组需要开通

首先配置DNS域名解析

–standalone 方式,属于 HTTP-01 验证。它的工作原理是:

  • Certbot 在你的服务器上启动一个临时Web服务,监听 80端口

  • Let's Encrypt 的验证服务器会访问:http://你的域名/.well-known/acme-challenge/随机字符串

  • 如果能成功访问到这个文件,就证明你对域名有控制权,颁发证书

  • 当你开启 Cloudflare 代理(橙色云朵)时,这个流程会被彻底打断:

    步骤关闭代理(灰色云朵)开启代理(橙色云朵)
    请求路径 用户 → 你的服务器 (47.77.22.58) 用户 → Cloudflare CDN → 你的服务器
    访问协议 HTTP (80端口) Cloudflare 会强制将HTTP重定向到HTTPS 
    验证结果 Let's Encrypt 直接访问你的服务器,成功验证 验证请求被重定向到 HTTPS(443端口),而你的 443 可能还没配证书,或者根本不是 Certbot 的临时服务,导致 404 或超时

    简单来说:开启代理后,Let's Encrypt 的验证请求会被 Cloudflare 拦截并强制跳转到 HTTPS,根本到不了 Certbot 监听的那个临时80端口服务。

    如果你实在不想关闭代理(例如为了保持 CDN 加速和 DDoS 防护),那么 –standalone 和 –webroot 都不行,你必须改用 DNS 验证方式。

    用hellojava.xyz做测试

    sudo certbot certonly –standalone \\
    -d hellojava.xyz \\
    -d www.hellojava.xyz \\
    -d xxx.hellojava.xyz

    上面的命令会要求你输入邮箱还有输入两次y同意条款,可以使用下面的命令

    sudo certbot certonly –standalone \\
    -d hellojava.xyz -d www.hellojava.xyz -d xxx.hellojava.xyz \\
    –non-interactive \\
    –agree-tos \\
    –email xxxx@qq.com #你的邮箱

    Successfully received certificate.
    Certificate is saved at: /etc/letsencrypt/live/hellojava.xyz/fullchain.pem
    Key is saved at:         /etc/letsencrypt/live/hellojava.xyz/privkey.pem
    This certificate expires on 2026-05-24.
    These files will be updated when the certificate renews.
    Certbot has set up a scheduled task to automatically renew this certificate in the background.
     

    保存的路径,三个证书使用同一个证书  还有续期时间

    成功之后  你就可以配置你的nginx了

    server {
    listen 443 ssl;
    server_name hellojava.xyz www.hellojava.xyz xxx.hellojava.xyz;

    ssl_certificate /etc/letsencrypt/live/hellojava.xyz/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/hellojava.xyz/privkey.pem;

    # 你的其他配置…
    }

    server {
    listen 80;
    server_name hellojava.xyz www.hellojava.xyz xxx.hellojava.xyz;
    return 301 https://$server_name$request_uri;
    }

    注意还是要要开启代理的,毕竟小云朵的代理是免费的,注意,小云朵开启代理后,模式必须是完全或者完全(严格)模式

    2.2 certbot的定时任务

    Certbot 会设置两种可能的自动续期机制之一:

    机制类型位置/名称说明
    Systemd 定时器 certbot-renew.timer 现代系统推荐方式,由 systemd 管理 
    Cron 定时任务 /etc/cron.d/certbot 传统方式,每12小时运行一次 

    为什么要有两个定时任务

    cat /etc/cron.d/certbot

    • 主次分明:在采用 Systemd 作为初始化系统(init system)的现代 Linux 发行版(如 Ubuntu 22.04)中,Systemd 定时器是首选的、更现代的定时任务管理器。因此,Cron 任务的设计初衷是在 Systemd 环境下的备用方案。

    • 如何实现:关键在于 Cron 任务中的那一行复杂命令 test -x /usr/bin/certbot -a \\! -d /run/systemd/system && …。这个命令会检查系统是否正在运行 Systemd。如果检测到 /run/systemd/system 目录存在(这是 Systemd 运行的标志),那么这条 Cron 命令的后续部分(perl -e 'sleep…' && certbot -q renew)将不会执行,Cron 任务会静默退出。这样,就确保了只有 Systemd 定时器在履行职责。

    # 查看 systemd 定时器(如果存在)
    sudo systemctl list-timers | grep certbot

    # 或者查看 cron 任务
    sudo cat /etc/cron.d/certbot
    # 通常你会看到类似:
    # 0 */12 * * * root certbot -q renew

    可以看到定时任务和对应服务

    # 查看定时器的详细状态
    sudo systemctl status certbot.timer

    # 查看定时器的具体配置
    sudo systemctl cat certbot.timer

    # 查看关联的 service 内容
    sudo systemctl cat certbot.service

    2.3如何自定义定时的systemd定时任务

    简单说你有个需要执行的脚本xxx.sh  给与执行权限

    里面写好你要干的事

    在/etc/systemd/system里放入你要定时的xxx.timer和xxx.server   xxx.time里定时会执行xxx.server要干的事xxx.sh

    # 重载配置
    sudo systemctl daemon-reload

    2.4 Standalone模式的坏处 也是三种模式中最不合适的

    Standalone模式的坏处 一般来说你需要开启CDN 并且你的Nginx肯定需要开启 一般会80重定向到443这样一来默认的certbot的定时任务即使执行了也没用 因为80端口被占用

    如果你非要使用那么必须关闭CDN  并且改写certbot的定时任务  例如nginx里使用了80端口  那么就必须先关闭nginx,因为Standalone模式 会自动在80端口运行一个web

    如果是Standalone和Webroot对比  那还是Webroot好点,因为Webroot重新申请的时候只需要关闭CDN,Nginx中配置一个  专门访问域名证书的路径

    server {
    listen 80;
    server_name 域名1 域名2 域名3;

    # 专门为 Certbot 验证添加的 location
    location ^~ /.well-known/acme-challenge/ {
    root /var/www/html; # 这里指定你的 webroot 路径
    default_type text/plain;
    }

    # 其他 location 配置…
    location / {
    # 你的其他配置,比如 proxy_pass 等
    }
    }

    即使你nginx中有运行也可以用

    就可以

    certbot renew 或者certbot -q renew申请临近30天内到期的证书

    上面只能30天内证书申请

    强制申请

    certbot renew –force-renew

    因此最好的方式是DNS

    Standalone 和 Webroot 都是 HTTP-01 验证,它们的共同点是:

    工作原理

  • Let's Encrypt 给 Certbot 一个随机令牌

  • Certbot 把这个令牌放在 http://你的域名/.well-known/acme-challenge/令牌 路径下

  • Let's Encrypt 通过 HTTP(80端口) 访问这个URL

  • 如果能成功拿到令牌,就证明你对域名有控制权

  • Standalone vs Webroot 的区别

    方式HTTP-01 验证的实现方式
    Standalone Certbot 自己启动一个临时 Web 服务器监听 80 端口来提供令牌文件
    Webroot 利用已有的 Nginx/Apache,通过配置好的路径提供令牌文件

    共同点:都需要 80端口可访问,都走 HTTP 协议。


    DNS-01 验证(DNS插件)

    你问的 DNS 方式是完全不同的验证机制:

    工作原理

  • Let's Encrypt 给 Certbot 一个随机令牌

  • Certbot 通过 DNS 服务商的 API,在你的域名下添加一个 TXT 记录:

    • 记录名称:_acme-challenge.你的域名

    • 记录值:令牌内容

  • Let's Encrypt 通过 DNS 查询这个 TXT 记录

  • 如果查询到正确的令牌,就证明你对域名有控制权

  • DNS-01 的关键特点

    特性说明
    端口要求 完全不依赖 80/443 端口
    协议 DNS 协议(53端口)
    CDN 兼容性 即使开启 Cloudflare 橙色云朵也能用
    通配符证书 支持 *.你的域名
    验证方式 通过 DNS TXT 记录,不是 HTTP

    赞(0)
    未经允许不得转载:171主机测评 » Certbot 申请SSL证书的三种方式详解(Ubuntu 22.04环境)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址