问题说明
本文用于排查启用HTTPS或上传SSL证书后,ZCenter页面无法打开、API返回502/503、浏览器证书报错或实际证书未更新的问题。ZCenter保存sslSetting后通过RabbitMQ异步通知Base更新Caddy,配置保存成功不代表Caddy已经加载成功。
现象
- 启用HTTPS后浏览器无法连接、TLS握手失败或返回错误证书。
- 上传证书接口成功,但访问时仍展示旧证书或内置证书。
- HTTP入口正常,HTTPS入口异常;或配置显示已启用但Caddy仍监听HTTP模式。
- Base或Caddy日志出现证书加载、Caddy管理API、MQ消息消费或端口监听错误。
适用环境
- 产品:ZCenter
- 版本:5.1.0
- 组件:Portal全局设置、Base、RabbitMQ、Caddy和SSL证书
可能原因
sslSetting已写入数据库,但RabbitMQ刷新事件未成功发送或消费。- Base无法访问Caddy管理接口
127.0.0.1:2019。 - 证书与私钥不匹配、PEM格式错误、私钥加密、证书链不完整或文件权限不足。
- Caddy动态监听端口8300/8301与外部负载均衡或端口映射不一致。
- 证书SAN与实际访问域名不匹配,或内置证书使用了非预期的主机IP。
- Caddy配置只部分更新,数据库状态和实际运行配置不一致。
排查步骤
1. 保留HTTP恢复通道并确认基础入口
curl -v --max-time 10 http://127.0.0.1:8100/
curl -v --max-time 10 http://127.0.0.1:8100/api/portal/v4/pub/login
- 预期结果:8100基础入口仍可访问。
- 异常处理:8100也不可达时先排查Caddy/Gateway基础服务和端口,不要继续修改证书。
2. 检查监听端口和Caddy管理接口
ss -lntp | grep -E ':(8100|8200|8300|8301|2019)\b'
curl -sS http://127.0.0.1:2019/config/apps/http/servers/srv3
curl -sS http://127.0.0.1:2019/config/apps/tls
- 预期结果:HTTPS启用时动态服务监听8301;HTTP模式监听8300;Caddy管理接口仅本机可访问。
- 异常处理:2019不可达时检查Caddy进程和管理接口;动态状态与数据库不一致时检查Base刷新事件。
3. 检查全局设置和刷新事件
- 查询
GLOBAL_SETTINGS/sslSetting的当前值,并搜索Base日志中的REFRESH_SSL_CONFIG、[***error***]和Caddy更新失败。 - 同时检查RabbitMQ的
inner_base队列和消费者。 - 判断:保存接口成功但没有刷新事件消费记录,优先处理RabbitMQ或Base监听器。
4. 校验证书、私钥和证书链
openssl x509 -in /var/lib/caddy/tls/tls.crt -noout -subject -issuer -serial -dates -fingerprint -sha256
openssl pkey -in /var/lib/caddy/tls/tls.key -noout -check
openssl x509 -in /var/lib/caddy/tls/tls.crt -pubkey -noout | openssl pkey -pubin -outform DER | openssl sha256
openssl pkey -in /var/lib/caddy/tls/tls.key -pubout -outform DER | openssl sha256
- 预期结果:证书有效,私钥可读取,两次公钥摘要一致,证书链和SAN满足访问域名要求。
- 异常处理:重新准备正确PEM证书和未加密私钥,修正文件权限;不要仅凭上传接口成功判断证书有效。
5. 检查实际对外证书
openssl s_client -connect <host>:<public-port> -servername <certificate-dns-name> -showcerts </dev/null
- 预期结果:返回目标证书和完整链,域名与SAN匹配。
- 异常处理:检查负载均衡、VIP、SNI和端口映射,确认请求确实到达目标Caddy实例。
处理方式
- 证书问题时,修正证书、私钥、链和文件权限后重新上传并触发SSL配置刷新。
- RabbitMQ或Base未消费刷新事件时,先恢复消息链路,再重新保存
sslSetting触发更新。 - Caddy管理接口不可用时,按部署规范恢复Caddy;不要直接只修改数据库配置。
- 需要快速恢复时,通过仍可用的HTTP入口将
sslSetting恢复为{"enable":false},并验证Caddy切回HTTP模板。 - 修正外部负载均衡/VIP到8300或8301的实际映射,具体公网端口以现场部署为准。
验证方法
- 配置验证:数据库中的
sslSetting与预期一致。 - Caddy验证:管理API中的动态服务和TLS对象已更新,监听端口符合模式。
- 证书验证:
openssl s_client返回预期证书、链和SNI结果。 - 业务验证:页面、静态资源和至少一个API请求均可通过目标HTTPS地址访问。
- 日志验证:Base和Caddy不再出现证书加载、管理API或TLS握手错误。
风险与回滚
- SSL开关为全局配置,变更可能影响所有用户和API客户端。
- 直接修改数据库不会触发Caddy刷新,可能造成配置长期不一致。
- 删除证书文件可能形成单文件残留状态,不应作为首选回滚方式。
- 操作前保存原
sslSetting、证书指纹和Caddy状态;失败时从HTTP通道恢复原设置和证书。
补充信息
- 端口和代理链路参见:ZCenter 部署或访问因端口未放通失败,如何排查?。
- RabbitMQ刷新事件排查参见:ZCenter 任务已执行但订单或操作状态一直处理中,如何排查 RabbitMQ?。
