最近遇到一个宝塔面板 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,也不要只看证书文件。排查顺序建议是:
- 用
openssl s_client看端口实际返回的证书 - 检查
/www/server/panel/ssl/下的面板证书文件 - 用
ss -lntp确认端口监听进程 - 如果文件已更新但端口仍返回旧证书,重启宝塔面板
这次的最终修复就是:证书文件已经正确,只需要重启宝塔面板进程让新证书生效。
更多内容欢迎关注公众号:
