acme.sh 手动签证书:宝塔面板申请失败怎么办
宝塔面板一键申请 Let's Encrypt 证书,报「验证失败,域名解析错误或验证URL无法被访问」。解析是对的,http://域名/.well-known/acme-challenge/ 手动放个测试文件也能访问到,但面板就是一直 404。
排查过程
用 nginx -T 导出全部生效配置,grep 站点域名——结果压根搜不到。也就是说面板说的"创建成功",nginx 里根本没有这个 server 块,验证请求全部落到了别的站上,当然 404。
解法:绕过面板,直接 acme.sh
第一步,装 acme.sh:
curl https://get.acme.sh | sh -s email=you@example.com
第二步,签发(webroot 模式指向站点目录):
/root/.acme.sh/acme.sh --issue -d example.com -d www.example.com \
--webroot /www/wwwroot/example.com --server letsencrypt
第三步,安装证书并配置自动续期:
/root/.acme.sh/acme.sh --install-cert -d example.com --ecc \
--fullchain-file /www/server/panel/vhost/cert/example.com/fullchain.pem \
--key-file /www/server/panel/vhost/cert/example.com/privkey.pem \
--reloadcmd "nginx -s reload"
注意事项
1. nginx 里要有 well-known 的验证配置,保证 /.well-known/ 路径能命中站点根目录,而且 80 端口这块不做 https 跳转(否则验证挂掉)。
2. acme.sh 的 --install-cert 会把续期动作写进自己的 cron,续期后自动执行 reloadcmd,全程不用管。
3. 面板里那份"申请失败"的记录不用管,证书装好后直接手写 server 块引用 pem 路径即可。
整个过程两分钟。面板一键申请适合标准建站流程,一旦你的 conf 不是面板模板生成的,它就容易找错目录,此时手动签反而是最稳的路。