域名解析生效、80/443端口开放、ICP备案(国内ECS)、Nginx配置匹配是Let’s Encrypt证书申请前置硬性条件;certbot --nginx依赖Nginx配置规范,推荐systemd timer续期;acme.sh需升级至支持ACME v2。

证书申请失败:域名解析和端口开放是硬门槛
绝大多数人卡在第一步,不是命令写错,而是环境没准备好。Let’s Encrypt 的验证流程必须能从公网访问你的 80 端口,并且能通过 HTTP 请求拿到挑战文件——这意味着:
- 域名的
A记录必须已生效,dig yourdomain.com +short要返回你服务器的真实公网 IP(不能是本地、内网或 CDN 回源 IP) - 阿里云/腾讯云等厂商的安全组,必须放行入方向的
80和443端口(来源填0.0.0.0/0) - 如果你用的是国内 ECS(如杭州、北京地域),
ICP 备案是强制前提,没备案的域名即使解析正确,Certbot 也会静默失败 - Nginx 必须已运行,且配置中
server_name严格匹配你要申请的域名(比如申请example.com,就不能只写www.example.com)
certbot --nginx 自动部署为什么有时不生效
这个命令看似一键,实则依赖 Nginx 配置的“可读性”和“结构合理性”。它会自动改写你的 /etc/nginx/conf.d/*.conf,但前提是:
- 原配置里不能有语法错误,
sudo nginx -t必须通过 - 不能把多个
server块塞进一个文件又混用if或重定向逻辑,Certbot 解析容易出错 - 如果 Nginx 是通过宝塔、AMH 等面板管理的,它的配置路径和 include 机制可能和 Certbot 默认预期不符,此时建议改用
certbot certonly --webroot手动指定根目录 - 执行时选了 “Yes” 强制跳转 HTTPS,但后续发现页面白屏或混合内容警告,大概率是网页里写了死的
http://资源链接,得自己搜 HTML/JS 源码改掉
续期脚本跑不通?systemd 定时任务比 crontab 更稳
sudo certbot renew --dry-run 成功,不代表真实续期就可靠。很多用户发现证书过期了才发现定时任务根本没跑。原因通常是:
- crontab 里用
root用户加的定时任务,但没指定完整路径,certbot命令找不到(应写成/usr/bin/certbot或/usr/local/bin/certbot) - 没有重载 Nginx,证书更新了但服务还在用旧的
fullchain.pem和privkey.pem,需加一行systemctl reload nginx - 更推荐用 systemd timer:
/etc/systemd/system/certbot-renew.timer+.service,它自带日志、依赖检查和失败通知,比裸 crontab 少一半维护成本
不用 certbot,acme.sh 更轻量但要注意默认 CA 切换
如果你服务器资源紧张(比如 512MB 内存 VPS),或者想绕过 Python 依赖,acme.sh 是个好选择。但它有个关键细节常被忽略:
- 2024 年底起,Let’s Encrypt 默认 CA 已切换为
https://acme-v02.api.letsencrypt.org/directory(ACME v2),老版本acme.sh若未升级,申请会报urn:acme:error:unauthorized - 安装后务必运行
acme.sh --upgrade,再用acme.sh --issue --standalone -d yourdomain.com测试 - 它不会自动改 Nginx 配置,证书路径在
~/.acme.sh/yourdomain.com/下,你需要手动把fullchain.cer和yourdomain.com.key软链或复制到 Nginx 配置里引用的位置
真正麻烦的从来不是命令怎么敲,而是 DNS 生效延迟、备案状态、Nginx include 层级、甚至 NS 服务商对 _acme.challenge 子域名的支持程度——这些地方一卡,所有自动化都停摆。动手前先用 curl -I http://yourdomain.com 和 openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 看两眼,比反复重试快得多。










