宝塔面板 HTTPS 端口证书不生效排查记录

19 阅读4分钟

最近遇到一个宝塔面板 HTTPS 端口证书不生效的问题:证书文件已经更新,但是浏览器访问面板地址时仍然提示证书异常。排查后发现,问题不在域名解析,也不在证书链,而是面板进程没有重新加载新的证书。

这类问题容易混淆,因为同一个域名在不同端口上可能使用完全不同的证书。例如:

https://panel.example.com/       # 网站 443 端口
https://panel.example.com:9527/  # 宝塔面板或其他服务端口

即使 443 端口的证书已经正常,面板端口仍然可能在使用旧证书。

现象

常见表现有几种:

  • 浏览器提示证书已过期
  • 浏览器提示证书名称不匹配
  • 检查证书文件发现已经是新证书
  • 访问面板端口仍然返回旧证书
  • 宝塔证书任务日志里出现 Python traceback,但最后又显示 Successful

其中最迷惑的是:文件里的证书是新的,但端口实际返回的仍然是旧证书。

第一步:确认端口实际返回的证书

不要只看本地证书文件,要直接检查服务端口返回的证书:

echo | openssl s_client -connect panel.example.com:9527 -servername panel.example.com 2>/dev/null \
| openssl x509 -noout -subject -dates -ext subjectAltName

重点看这几项:

subject=CN=panel.example.com
notBefore=...
notAfter=...
X509v3 Subject Alternative Name:
    DNS:panel.example.com

如果这里显示的是旧的 notAfter,说明访问端口仍然在返回旧证书。

第二步:确认面板证书文件

宝塔面板 SSL 证书一般在:

/www/server/panel/ssl/certificate.pem
/www/server/panel/ssl/privateKey.pem

检查证书内容:

openssl x509 -in /www/server/panel/ssl/certificate.pem -noout -subject -dates -ext subjectAltName

如果这个文件显示的是新证书,但上一步端口返回的是旧证书,基本可以判断为进程没有重新加载。

第三步:确认端口是谁在监听

面板端口不一定永远由宝塔面板进程监听,也可能被 Nginx 或其他服务接管。先看监听进程:

ss -lntp | grep ':9527'

如果是宝塔面板进程,处理面板 SSL 即可。

如果是 Nginx,则要去找对应的 listen 9527 ssl 配置:

grep -R "listen .*9527" /www/server/panel/vhost/nginx /www/server/nginx/conf -n

然后检查配置里的证书路径:

ssl_certificate     /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;

第四步:重启宝塔面板进程

这次问题的关键就在这里:证书文件已经换好了,但宝塔面板进程还没有重新加载。

直接重启宝塔面板:

bt 1

也可以使用:

/etc/init.d/bt restart

重启后再检查端口证书:

echo | openssl s_client -connect panel.example.com:9527 -servername panel.example.com 2>/dev/null \
| openssl x509 -noout -subject -dates -ext subjectAltName

看到新的过期时间,说明已经生效。

如果宝塔证书任务报 No module named 'mod'

有时宝塔的证书任务会出现类似错误:

ModuleNotFoundError: No module named 'mod'

即使日志最后显示 Successful,也不要直接相信。前面已经出现 traceback,说明任务链路中断过。

可以先检查模块是否存在:

ls -ld /www/server/panel/mod
ls -l /www/server/panel/mod/base.py

如果文件缺失,优先修复宝塔面板:

bt 16

或者执行面板更新修复脚本:

curl -sSO https://download.bt.cn/install/update_panel.sh && bash update_panel.sh

修复后重启面板:

bt 1

手动替换面板证书

如果只是要快速恢复访问,可以手动替换面板证书:

cp /www/server/panel/ssl/certificate.pem /www/server/panel/ssl/certificate.pem.bak
cp /www/server/panel/ssl/privateKey.pem /www/server/panel/ssl/privateKey.pem.bak

cp /path/to/fullchain.pem /www/server/panel/ssl/certificate.pem
cp /path/to/privkey.pem /www/server/panel/ssl/privateKey.pem

chmod 644 /www/server/panel/ssl/certificate.pem
chmod 600 /www/server/panel/ssl/privateKey.pem

bt 1

注意:

  • certificate.pem 建议使用完整证书链
  • privateKey.pem 必须和证书匹配
  • 证书 SAN 必须包含面板访问域名
  • 替换后一定要重启面板进程

总结

宝塔面板 HTTPS 端口证书不生效时,不要只看网站 SSL,也不要只看证书文件。排查顺序建议是:

  1. openssl s_client 看端口实际返回的证书
  2. 检查 /www/server/panel/ssl/ 下的面板证书文件
  3. ss -lntp 确认端口监听进程
  4. 如果文件已更新但端口仍返回旧证书,重启宝塔面板

这次的最终修复就是:证书文件已经正确,只需要重启宝塔面板进程让新证书生效。


更多内容欢迎关注公众号:

公众号关注二维码