这类问题我又碰上了一次。安全加固时把 80 端口整体关闭只留 443,Let's Encrypt 续签立刻开始失败,日志里是 connection refused,证书到期前三天才发现。

第一反应是「验证路径被伪静态规则改写,返回的不是挑战内容」,验证下来不成立。

把日志和配置对完,能解释这个现象的基本就这几处。http-01 验证要求 80 端口可达,防火墙直接拒绝;CDN 层把 http 强制 301 到 https,验证请求被跳走;acme 客户端缓存了旧配置,没有切到 dns 模式。

第一件事是确认 80 端口从公网是否可达

curl -sI http://www.example.com/.well-known/acme-challenge/test

接着改用 dns-01 验证并配置 API 凭据

acme.sh --issue -d example.com --dns dns_dp --keylength ec-256

保留一条 80 端口仅放行挑战路径的规则

location ^~ /.well-known/acme-challenge/ { root /var/www/acme; }

强制续签一次并看重载结果

acme.sh --renew -d example.com --force && nginx -s reload

那几天正好在做别的变更,先把时间线对齐才敢动手。

改完先别撤,确认这几项。续签日志显示验证通过,证书到期时间延后九十天,443 上的证书序列号与新签发的一致。

补一句。关 80 端口之前先确认验证方式,dns-01 不依赖端口,长期看比重开 80 更省事。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189