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 验证。它的工作原理是:

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

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

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

当你开启 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 验证,它们的共同点是:

工作原理

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

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

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

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

Standalone vs Webroot 的区别

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

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


DNS-01 验证(DNS插件)

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

工作原理

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

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

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

    • 记录值:令牌内容

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

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

DNS-01 的关键特点

特性 说明
端口要求 完全不依赖 80/443 端口
协议 DNS 协议(53端口)
CDN 兼容性 即使开启 Cloudflare 橙色云朵也能用
通配符证书 支持 *.你的域名
验证方式 通过 DNS TXT 记录,不是 HTTP
相关推荐
budingxiaomoli2 小时前
TCP协议和UDP协议
网络·网络协议·udp
2401_865854882 小时前
兔唧内网文件快传是什么 怎么用?快传使用教程
网络
古译汉书2 小时前
【IoT死磕系列】Day 6:工业控制底层大动脉—CAN总线
linux·网络·arm开发·单片机·物联网·tcp/ip
SamtecChina20232 小时前
Samtec连接器设计研究 | 载流量:温升为什么重要?
大数据·网络·人工智能·算法·计算机外设
打码人的日常分享2 小时前
双碳智慧园区建设方案(PPT)
大数据·运维·网络·云计算·制造
笨蛋不要掉眼泪3 小时前
Spring Cloud Gateway 核心篇:深入解析过滤器(Filter)机制与实战
java·服务器·网络·后端·微服务·gateway
BugShare3 小时前
路由器配置 DDNS 实现稳定的远程访问
网络·智能路由器
迪巴拉15253 小时前
抗社交网络压缩的鲁棒对抗扰动生成研究
网络·人工智能·php
安谦柔3 小时前
Windows系统电脑无法通过USB连接网络的解决方案
网络·windows