You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

为何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

火山引擎 最新活动