为何Certbot突然回退至http-01挑战而非tls-sni-01(HTTPS)?
解决Certbot默认挑战从tls-sni-01切换到http-01的问题
哦,这个问题我之前帮好几个用户排查过——大概率不是你的脚本或防火墙突然“抽风”,核心原因是Let's Encrypt在2020年就正式停用了tls-sni-01挑战方式,现在所有符合规范的ACME客户端(包括Certbot)都会自动 fallback到http-01作为默认选项,除非你手动指定了其他支持的挑战类型(比如dns-01)。
下面是一步步的排查和验证步骤:
1. 先确认Certbot的行为逻辑
首先可以查看Certbot的日志,这里面会明确告诉你为什么切换了挑战方式:
tail -n 50 /var/log/letsencrypt/letsencrypt.log
你大概率会看到类似这样的日志条目:
tls-sni-01 challenge is deprecated, falling back to http-01
这就坐实了是服务端强制禁用导致的,不是你的配置问题。
2. 检查你的Certbot配置是否被修改
虽然自动切换是默认行为,但还是可以检查有没有配置文件或命令行参数影响了挑战方式:
- 查看全局配置文件:
cat /etc/letsencrypt/cli.ini,看看有没有preferred_challenges参数 - 检查你的Bash脚本里调用Certbot的命令,有没有添加
--preferred-challenges参数,如果之前指定了tls-sni-01,现在Certbot会忽略这个参数并自动切换
3. 验证防火墙与网络连通性
既然现在用http-01挑战,必须确保以下几点:
- 服务器的80端口在本地防火墙(比如ufw、firewalld、iptables)中是对外开放的:
比如用ufw的话,执行ufw allow 80/tcp并确认状态ufw status - 如果你的服务器在云平台(AWS、阿里云等),还要检查云服务商的安全组/网络ACL,确保80端口允许来自任意IP的入站请求
- 验证外部是否能访问你的80端口:可以用另一台机器执行
curl -I http://你的域名,如果返回200或3xx状态码,说明连通性没问题
4. 如果你需要切换到其他挑战方式
如果http-01不适合你的场景(比如80端口被占用或无法对外开放),可以考虑用dns-01挑战,这种方式不需要开放端口,只需要在你的DNS服务商那里添加TXT记录。你可以在Certbot命令中指定:
certbot renew --preferred-challenges dns
或者在/etc/letsencrypt/cli.ini中添加一行:
preferred_challenges = dns
内容的提问来源于stack exchange,提问作者Houman




