ssl证书在双机热备中必须主备完全一致,包括路径、权限、内容及原子化同步更新,并通过指纹校验、语法检查和openssl连接验证闭环确认。

在双机热备(如 Keepalived + Nginx)环境中,SSL 证书必须在主备节点间保持完全一致,否则 VIP 切换后 HTTPS 会因证书路径缺失、权限错误或内容不一致而中断。统一管理不是“只配一次”,而是确保证书文件、路径、权限、更新动作在两台机器上实时同步且原子生效。
证书存放路径与权限需严格统一
主备节点必须使用完全相同的绝对路径存放证书(如 /etc/nginx/ssl/example.com/fullchain.pem 和 /etc/nginx/ssl/example.com/privkey.pem),不能依赖相对路径或符号链接。私钥权限必须为 600,证书链为 644;若备机权限宽松(如 644),Nginx 启动会拒绝加载私钥。建议在两台机器上执行:
- mkdir -p /etc/nginx/ssl/example.com
- chmod 700 /etc/nginx/ssl(限制目录访问)
- chown root:root /etc/nginx/ssl/example.com
自动同步证书 + 原子化重载
证书更新(如 Certbot 续期)只应在主节点操作,再通过 rsync 推送至备节点,并触发远程重载。关键在于“先同步、再重载”,避免中间状态:
- 用 rsync -avz --delete 同步整个证书目录,确保删除备机残留旧文件
- 同步完成后,立即执行 ssh user@backup "systemctl reload nginx"
- 可在同步脚本中加入校验:ssh user@backup "openssl x509 -in /etc/nginx/ssl/example.com/fullchain.pem -noout -fingerprint",比对主备指纹是否一致
配置层面规避单点依赖
Nginx 配置本身不参与“统一管理”,但需设计为无状态:所有 ssl_certificate 和 ssl_certificate_key 指令都使用绝对路径,且不嵌套在 if 或 map 中;server_name 与证书 SAN 严格匹配,避免因 SNI 不匹配导致 fallback 到 default_server 并报错。Keepalived 的 health check 脚本(如 nginx_check.sh)应包含 curl -kI https://localhost,确保 HTTPS 端口能响应,而非仅检查进程是否存在。
更新流程必须闭环验证
每次证书更新后,需人工或脚本验证三项:
- 主备节点证书文件 mtime 和 sha256sum 完全一致
- 主备 Nginx 配置语法均通过 nginx -t
- 用 openssl s_client -connect VIP:443 -servername example.com 连接,确认返回的证书 Subject 和 SAN 匹配预期,且 Verify return code 为 0











