证书到期前一周开始报警,手动跑续期也失败,报 challenge 校验不过。
排查:
- certbot 用的是 webroot 模式,验证文件写到 /var/www/html/.well-known/acme-challenge/
- 文件确实生成了,本地 curl 也能访问
- 但 Let's Encrypt 从外部访问不到
原因:80 端口的 server 块里,acme-challenge 的 location 写在了 return 301 后面。nginx 匹配 location 是精确优先,但 server 级别的 return 会在 location 之前生效,直接跳走了。
解法:把 acme location 放到最前面,或者用单独的 server 块只处理 80 的验证请求。
顺手加了个续期后的 reload hook,不然证书更新了 nginx 还用着旧的。
血的教训:改 nginx 配置后一定用外部工具验证,别只用 curl 本地。本地通外部不通,八成是反代或者防火墙。
主楼- 暂无回复
继续逛逛