证书过期导致服务启动失败时,应先用 journalctl -u 服务名 -n 200 --no-pager | grep -i -E "(ssl|tls|certificate|x509|expired|invalid)" 提取线索,再通过 openssl x509 -in /path/to/cert.crt -noout -dates 验证有效期,并检查证书路径、权限及服务配置中 Certificate/Key 参数是否正确。

证书过期导致服务启动失败时,系统日志里通常不会直接写“证书过期”四个字,但会留下关键线索。重点不是猜原因,而是顺着日志里的错误信号快速定位到具体证书文件和失效环节。
查 journalctl 日志找 TLS/SSL 相关报错
大多数 systemd 服务的日志都可通过 journalctl 查看。执行:
journalctl -u 服务名 -n 200 --no-pager | grep -i -E "(ssl|tls|certificate|x509|license|expired|invalid)"
常见有效线索包括:
- x509: certificate has expired(最直接的证据)
- failed to load TLS cert/key 或 cannot load certificate
- invalid license、license expiration(如 Kingbase、瀚高等商业数据库)
- handshake failed、no suitable certificate found(常出现在反向代理或网关类服务)
结合 openssl 验证可疑证书有效期
从日志中提取出疑似证书路径(如 /etc/nginx/ssl/server.pem、/etc/kubernetes/pki/apiserver.crt、/opt/highgo/hgdb-4.5/etc/lic/hgdb.lic 等),用 openssl 快速验证:
openssl x509 -in /path/to/cert.crt -noout -dates
输出示例:
notBefore=May 10 08:22:34 2025 GMT
notAfter=Aug 08 08:22:34 2025 GMT
若当前时间已超过 notAfter,即确认过期。注意:部分服务(如 kubeadm 集群)还依赖 ca.crt,它若过期需重建 CA,不能仅续签 leaf 证书。
检查服务单元配置中的证书路径是否真实存在且可读
有些服务启动失败,表面是证书问题,实则是路径写错或权限不足:
- 运行 systemctl cat 服务名,查找 Certificate=、Key=、Environment= 或 ExecStart= 中涉及证书的参数
- 确认对应文件是否存在:ls -l /etc/xxx/xxx.crt
- 检查属主与权限:stat /etc/xxx/xxx.crt;例如瀚高数据库要求 hgdb.lic 权限必须为 600,否则拒绝加载
留意服务是否因证书问题被静默拒绝而非崩溃退出
某些服务(如 OpenClaw Gateway、Nginx HTTPS 站点)在证书无效时不会报错退出,而是监听端口失败或返回空白响应。此时需额外验证:
- 用 ss -tlnp | grep :端口号 确认端口是否真被监听
- 尝试本地 curl 测试:curl -vk https://localhost:端口(-k 跳过证书校验,观察是否能连通)
- 查看服务进程是否存活但无有效连接:ps aux | grep 服务名


















