Let's Encrypt的证书有效期是90天,宝塔默认挂着一条自动续签的计划任务,到期前30天开始尝试。这条任务失败不弹窗、不发邮件,面板首页也看不出异常。等到证书真过期,表现先是从“您的连接不是私密连接”开始,接着公众号接口、支付回调、小程序校验这些必须走HTTPS的地方一起中断。更麻烦的是浏览器会把之前点过的例外记住,你以为站点正常,换台设备打开才发现一片红。回头翻日志,续签已经连续失败好几轮了。
续签失败先找日志,别急着点重签
面板的“计划任务”列表里有一条“续签Let's Encrypt证书”,点开能看到每次执行的完整输出,成功失败都记着,每次的执行时间也标着。
报错基本落在四类:连接超时、403拒绝、DNS解析不到、域名与证书不匹配。四类的处理路径完全不同,先分清属于哪一类,比反复点“续签”管用得多。日志里搜challenge这个词,能直接跳到验证那一步,往下看几行就能看到原因。服务器上也能直接翻,证书相关的记录落在/www/server/panel/vhost/letsencrypt目录下,按域名分文件夹存。如果日志里连验证那一步的记录都没有,说明任务根本没跑到验证那一步,先去看计划任务是不是被停用了。
80端口不通,验证文件根本下不来
HTTP-01的验证方式是CA访问http://你的域名/.well-known/acme-challenge/加一串随机文件名,读到指定内容才算通过。文件送不出去,验证必然失败。
常见三种:安全组只放了443没放80;nginx配置里把80整段删了只留443;服务器前面套了CDN,但CDN没回源到80端口。
机器上跑着两套web服务的情况更隐蔽:面板自带的nginx占了80,另外编译的一套占443,验证文件写进了其中一边的根目录,另一边自然读不到。这种情况日志里看不出异常,只能用ss看80端口到底被哪个进程听着。查完端口再查防火墙,两层都通了,文件才真的能被外面读到。
解析换了,证书还指着老地址
域名解析变过也会让续签失败。换过服务器IP、中途上过CDN、或者把A记录改成了CNAME,CA按旧地址去验证,自然拿不到那个文件。
强行重签成功也不解决问题:证书本身是对的,但跟你现在这台机器对不上,浏览器照样报警。查的办法很直接,dig一下域名看返回的IP,跟服务器的公网IP比对,两个不一样就是这个问题。改完解析要等生效,别急着点重签。另外换个网络环境再dig一次,有些运营商的递归服务器缓存能留很久,本地看着已经生效,外面还没更新。
实在开不了80,就走DNS验证
80端口实在开不了,比如机房封了、或者这台机器还要跑别的东西,申请证书时把验证方式改成DNS就行。DNS验证是在解析里加一条TXT记录,CA读到就算通过,全程不需要80端口,宝塔支持填API密钥自动加。
Let's Encrypt对同一组域名有签发频率限制,一周内重复签发的次数有上限,这条最容易踩。失败之后别连着点重签,点多了会直接报too many certificates,得等限制窗口过去才能再试。先修好原因,再签一次。
原因修完,先手动执行一次计划任务,看着它完整跑过一次、状态变绿,再交回定时。别改完配置就撒手,等一个月后才发现它还是失败的。
申请创业报道,分享创业好点子。点击此处,共同探讨创业新机遇!
