服务器上配置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 |