多台服务器共用一张SSL证书怎么部署和同步?
多台服务器共用一张SSL证书,最推荐使用Nginx共享证书目录或Let's Encrypt的DNS API自动更新方案,这比手动复制证书更安全可靠。
怎么通过共享目录实现Nginx证书同步?
结论:在所有服务器上挂载同一个NFS共享目录或使用本地挂载,配置Nginx读取该目录下的证书文件。
这是最传统且简单的方案。假设你有一台主服务器(Server A)负责生成证书,其他服务器(Server B、Server C)作为客户端挂载该证书目录。
- 准备证书: 在Server A上使用Let's Encrypt或OpenSSL生成证书文件(通常包括fullchain.pem和privkey.pem),并修改文件权限为644,所有者为nginx运行用户(如www-data)。
- 配置NFS挂载: 在Server B和Server C上安装nfs-common工具,通过编辑
/etc/fstab挂载Server A的证书目录。
# /etc/fstab 示例
server_a_ip:/data/ssl /etc/nginx/ssl nfs defaults 0 0
- 修改Nginx配置: 所有服务器的nginx配置文件中,ssl_certificate路径必须指向同一个挂载点。
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
- 重启服务: 修改配置后执行
systemctl reload nginx使配置生效。
怎么用DNS API自动更新证书?
结论:利用Let's Encrypt的DNS验证插件,在DNS服务商处配置API凭证,实现证书自动续期和分发。
如果服务器之间网络不通,无法使用共享目录方案,DNS API是最佳选择。它利用DNS TXT记录进行验证,不依赖服务器间的网络互通。
- 安装Certbot插件: 在所有服务器上安装Certbot及其对应DNS服务商的插件(如
certbot-dns-cloudflare)。 - 配置API凭证: 创建一个包含API Token的INI文件(如
/root/.secrets/certbot.ini),设置权限为600。
dns_cloudflare_api_token = your_api_token_here
- 配置续期脚本: 编辑crontab,设置每天凌晨3点检查证书是否过期。
0 3 * * * certbot renew --quiet --deploy-hook "systemctl reload nginx"
注意:--deploy-hook参数会在证书成功更新后自动执行,确保所有服务器上的nginx同步加载了新证书。
手动同步证书有哪些风险和注意事项?
结论:手动复制证书存在严重的安全风险,必须确保证书文件权限正确且同步时间点一致。
手动通过SCP或FTP复制证书文件是最容易出错的环节,建议尽量避免。
- 权限陷阱: 如果证书文件权限设置为777,nginx将拒绝加载,导致网站502错误。必须严格执行
chmod 644和chown nginx:nginx。 - 版本一致性: 如果A服务器已更新证书,而B服务器还在使用旧证书,会导致证书链验证失败。建议编写简单的Shell脚本,利用
diff命令对比服务器上的证书文件MD5值,如果不一致则自动同步。
# 简单的同步脚本示例
md5sum /etc/nginx/ssl/*.pem > /tmp/certs.md5
scp /tmp/certs.md5 user@server_b:/tmp/
ssh user@server_b "md5sum -c /tmp/certs.md5"
- 安全建议: 绝对不要将私钥文件(privkey.pem)上传到公共代码仓库或分享给他人,私钥泄露等同于网站被劫持。
总结
多台服务器部署SSL证书的核心在于“自动化”和“一致性”。无论是通过NFS共享目录还是DNS API,其目的都是为了防止因证书过期或版本不一致导致的服务中断。建议优先选择Let's Encrypt配合DNS API的方式,既安全又免去了维护共享存储的麻烦。
本文转载自 GJ站长论坛,原文地址:https://www.gj0.com/thread-2682.html
转载请注明出处,版权归原作者所有。
转载请注明出处,版权归原作者所有。
全部回复 0
还没有回复,来抢沙发~