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

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

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

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

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

现象

常见表现有几种:

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

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

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

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

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

重点看这几项:

text 复制代码
subject=CN=panel.example.com
notBefore=...
notAfter=...
X509v3 Subject Alternative Name:
    DNS:panel.example.com

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

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

宝塔面板 SSL 证书一般在:

bash 复制代码
/www/server/panel/ssl/certificate.pem
/www/server/panel/ssl/privateKey.pem

检查证书内容:

bash 复制代码
openssl x509 -in /www/server/panel/ssl/certificate.pem -noout -subject -dates -ext subjectAltName

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

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

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

bash 复制代码
ss -lntp | grep ':9527'

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

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

bash 复制代码
grep -R "listen .*9527" /www/server/panel/vhost/nginx /www/server/nginx/conf -n

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

nginx 复制代码
ssl_certificate     /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;

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

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

直接重启宝塔面板:

bash 复制代码
bt 1

也可以使用:

bash 复制代码
/etc/init.d/bt restart

重启后再检查端口证书:

bash 复制代码
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'

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

text 复制代码
ModuleNotFoundError: No module named 'mod'

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

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

bash 复制代码
ls -ld /www/server/panel/mod
ls -l /www/server/panel/mod/base.py

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

bash 复制代码
bt 16

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

bash 复制代码
curl -sSO https://download.bt.cn/install/update_panel.sh && bash update_panel.sh

修复后重启面板:

bash 复制代码
bt 1

手动替换面板证书

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

bash 复制代码
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. 如果文件已更新但端口仍返回旧证书,重启宝塔面板

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


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

相关推荐
Sokach10155 小时前
Linux Shell 脚本从零到能用:一个新手的一天学习总结
linux
SelectDB21 小时前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
AlfredZhao21 小时前
Docker 容器时区不对,`timedatectl` 不存在怎么办?
linux·timezone
zzzzzz3102 天前
9K Star 炸裂开源!这个 C 语言写的代码知识图谱,把 Linux 内核索引压缩到了 3 分钟
linux·服务器·sql
XIAOHEZIcode2 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220703 天前
如何搭建本地yum源(上)
运维
ping某4 天前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
A小辣椒4 天前
TShark:Wireshark CLI 功能
linux
A小辣椒4 天前
TShark:基础知识
linux
AlfredZhao4 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci