ssl证书不感知vip漂移,需所有节点同步相同证书私钥并由nginx统一加载;keepalived仅调度vip,https能力依赖nginx配置、证书有效性及tls握手成功。

SSL 证书本身不感知 VIP 漂移,关键在于所有节点必须提前部署完全一致的证书和私钥,并由 Nginx 统一加载——Keepalived 只管把 VIP 绑到健康节点,真正的 HTTPS 服务能力全靠 Nginx 配置是否正确、证书是否有效、握手是否能通。
证书文件必须全量同步且权限严格
主备节点的证书(ssl_certificate)与私钥(ssl_certificate_key)必须逐字相同,路径一致,推荐统一存放在 /etc/nginx/ssl/example.com.pem 和 /etc/nginx/ssl/example.com.key:
- 使用 rsync 或 inotify+rsync 实时同步,避免手工拷贝遗漏
- 私钥权限必须设为 600(
chmod 600 /etc/nginx/ssl/*.key),否则 Nginx 启动会拒绝加载 - 建议额外部署 ssl_trusted_certificate,用于 OCSP Stapling 验证链完整性
Nginx 配置需显式启用 TLS 安全策略
仅放对文件不够,配置中必须明确限定协议版本、加密套件与安全头,确保每个节点对外提供同等强度的 HTTPS 服务:
- 强制启用 TLSv1.2 和 TLSv1.3:
ssl_protocols TLSv1.2 TLSv1.3; - 禁用 CBC 类、RC4 等弱套件,优先选 AEAD 套件,例如:
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384; - 添加 HSTS 头:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; - 开启 OCSP Stapling 并设置超时:
ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/nginx/ssl/ca-bundle.crt;
Keepalived 必须验证 SSL 握手有效性,不能只看端口通不通
默认 VRRP 心跳无法识别证书过期、SNI 不匹配或 TLS 协商失败。若不加检查,VIP 可能漂移到一个“能 ping 通但打不开 HTTPS”的节点,用户直接看到 ERR_SSL_PROTOCOL_ERROR:
- 编写检测脚本(如 /etc/keepalived/check_nginx_ssl.sh),用 openssl 验证握手与证书链:
openssl s_client -connect 127.0.0.1:443 -servername example.com -verify_return_error -timeout 5 > /dev/null - 在 keepalived.conf 中定义 vrrp_script,每 3 秒执行一次,连续失败 3 次则降权:
fall 3 rise 2 interval 3 - 将该 script 加入
track_script,确保 VIP 只落在真正能完成 TLS 握手的节点上
切换前后需保证连接平滑,避免会话中断
VIP 漂移瞬间,客户端 TCP 连接会断开,但可通过配置降低影响:
- Nginx 开启会话复用:
ssl_session_cache shared:SSL:10m; ssl_session_timeout 4h; - 后端应用支持 HTTP/2 时,启用
http2监听,提升重建连接效率 - 前端 DNS 缓存时间不宜过长(建议 TTL ≤ 60s),便于故障恢复后快速切回主节点











