{{item}}
{{item.title}}
{{items.productName}}
{{items.price}}/年
{{item.title}}
部警SSL证书可实现网站HTTPS加密保护及身份的可信认证,防止传输数据的泄露或算改,提高网站可信度和品牌形象,利于SEO排名,为企业带来更多访问量,这也是网络安全法及PCI合规性的必备要求
前往SSL证书通过Shell脚本实现SSL证书的批量部署,既能标准化操作流程,又能大幅提升运维效率。本文将从环境准备、脚本设计、执行验证等维度,详细介绍批量部署SSL证书的完整方案。
批量部署SSL证书的前提是确保环境一致性与资源就绪,避免因依赖缺失或配置混乱导致脚本执行失败。
首先需明确批量部署的范围:
目标服务器需满足以下条件,确保脚本可正常执行:
为避免操作混乱,需提前明确:
Shell脚本的核心逻辑是 “批量遍历目标服务器→传输证书文件→更新配置→验证与重启服务”,需兼顾灵活性与容错性。以下是一个针对Nginx服务的批量部署脚本示例及关键步骤解析。
1 #!/bin/bash
2 # 批量部署 SSL 证书至 Nginx 服务器
3 # 作者:运维团队
4 # 日期:2024-07-21
5
6 # 配置参数
7 LOCAL_CERT_DIR="/ssl/certs" # 本地证书存放目录
8 REMOTE_CERT_DIR="/etc/ssl/certs" # 目标服务器证书目录
9 NGINX_CONF_DIR="/etc/nginx/conf.d" # Nginx配置目录
10 SERVER_LIST=("192.168.1.101" "192.168.1.102" "192.168.1.103") # 目标服务器IP列表
11 DOMAIN="example.com" # 证书对应的域名
12
13 # 日志文件
14 LOG_FILE="/var/log/ssl_deploy_$(date +%Y%m%d).log"
参数定义需遵循 “可配置化” 原则,通过变量集中管理路径、服务器列表等,便于后续修改与扩展。
脚本需先将本地证书传输至目标服务器,并自动备份旧证书:
1 deploy_cert() {
2 local server_ip=$1
3 echo "===== 开始部署证书至 $server_ip =====" | tee -a $LOG_FILE
4
5 # 检查本地证书是否存在
6 if [ ! -f "$LOCAL_CERT_DIR/$DOMAIN.crt" ] || [ ! -f "$LOCAL_CERT_DIR/$DOMAIN.key" ]; then
7 echo "错误:本地证书文件缺失!" | tee -a $LOG_FILE
8 return 1
9 fi
10
11 # 备份目标服务器旧证书
12 ssh root@$server_ip "mkdir -p $REMOTE_CERT_DIR/backup/$(date +%Y%m%d)"
13 ssh root@$server_ip "if [ -f $REMOTE_CERT_DIR/$DOMAIN.crt ]; then cp $REMOTE_CERT_DIR/$DOMAIN.crt 14$REMOTE_CERT_DIR/backup/$(date +%Y%m%d)/; fi"
14 ssh root@$server_ip "if [ -f $REMOTE_CERT_DIR/$DOMAIN.key ]; then cp $REMOTE_CERT_DIR/$DOMAIN.key $REMOTE_CERT_DIR/backup/$(date +%Y%m%d)/; fi"
15
16 # 传输新证书至目标服务器
17 scp $LOCAL_CERT_DIR/$DOMAIN.crt root@$server_ip:$REMOTE_CERT_DIR/
18 scp $LOCAL_CERT_DIR/$DOMAIN.key root@$server_ip:$REMOTE_CERT_DIR/
19 scp $LOCAL_CERT_DIR/ca-bundle.crt root@$server_ip:$REMOTE_CERT_DIR/
20
21 # 设置私钥权限(关键!避免权限过高导致Nginx启动失败)
22 ssh root@$server_ip "chmod 600 $REMOTE_CERT_DIR/$DOMAIN.key"
23 }
此步骤通过 ssh 和 scp 命令远程操作,先备份旧证书(按日期分类存放),再传输新证书并修正权限,确保符合Web服务的安全要求。
证书部署后需更新Nginx配置文件(指向新证书路径),并重启服务:
1 update_nginx_config() {
2 local server_ip=$1
3 echo "===== 开始更新 $server_ip 的Nginx配置 =====" | tee -a $LOG_FILE
4
5 # 远程修改Nginx配置(假设域名配置文件为$DOMAIN.conf)
6 ssh root@$server_ip "sed -i 's|ssl_certificate .*|ssl_certificate $REMOTE_CERT_DIR/$DOMAIN.crt;|g' $NGINX_CONF_DIR/$DOMAIN.conf"
7 ssh root@$server_ip "sed -i 's|ssl_certificate_key .*|ssl_certificate_key $REMOTE_CERT_DIR/$DOMAIN.key;|g' $NGINX_CONF_DIR/$DOMAIN.conf"
8 ssh root@$server_ip "sed -i 's|ssl_trusted_certificate .*|ssl_trusted_certificate $REMOTE_CERT_DIR/ca-bundle.crt;|g' $NGINX_CONF_DIR/$DOMAIN.conf"
9
10 # 验证Nginx配置是否正确
11 ssh root@$server_ip "nginx -t"
12 if [ $? -ne 0 ]; then
13 echo "错误:$server_ip 的Nginx配置无效,已回滚证书!" | tee -a $LOG_FILE
14 # 回滚至旧证书
15 ssh root@$server_ip "cp $REMOTE_CERT_DIR/backup/$(date +%Y%m%d)/$DOMAIN.crt $REMOTE_CERT_DIR/"
16 ssh root@$server_ip "cp $REMOTE_CERT_DIR/backup/$(date +%Y%m%d)/$DOMAIN.key $REMOTE_CERT_DIR/"
17 return 1
18 fi
19
20 # 重启Nginx服务
21 ssh root@$server_ip "systemctl restart nginx"
22 if [ $? -ne 0 ]; then
23 echo "错误:$server_ip 的Nginx重启失败,已回滚证书!" | tee -a $LOG_FILE
24 ssh root@$server_ip "cp $REMOTE_CERT_DIR/backup/$(date +%Y%m%d)/$DOMAIN.crt $REMOTE_CERT_DIR/"
25 ssh root@$server_ip "cp $REMOTE_CERT_DIR/backup/$(date +%Y%m%d)/$DOMAIN.key $REMOTE_CERT_DIR/"
26 ssh root@$server_ip "systemctl restart nginx" # 尝试用旧证书重启
27 return 1
28 fi
29 }
此步骤通过 sed 命令远程修改配置文件,并用 nginx -t 验证配置合法性。若验证失败或重启报错,立即回滚至旧证书,避免服务中断。
4. 批量执行与结果校验
最后通过循环遍历服务器列表,批量执行部署逻辑,并验证证书有效性:
1 # 主函数:批量部署
2 main() {
3 echo "===== 开始批量部署 SSL 证书($(date)) =====" | tee -a $LOG_FILE
4
5 for server in "${SERVER_LIST[@]}"; do
6 deploy_cert $server
7 if [ $? -ne 0 ]; then
8 echo "===== $server 部署失败,跳过 =====" | tee -a $LOG_FILE
9 continue
10 fi
11
12 update_nginx_config $server
13 if [ $? -eq 0 ]; then
14 echo "===== $server 部署成功 =====" | tee -a $LOG_FILE
15 # 验证证书是否生效(通过openssl检查远程证书)
16 openssl s_client -connect $server:443 -servername $DOMAIN < /dev/null 2>/dev/null | grep "Verify return code: 0 (ok)"
17 if [ $? -eq 0 ]; then
18 echo "===== $server 证书验证通过 =====" | tee -a $LOG_FILE
19 else
20 echo "警告:$server 证书部署后验证失败,请手动检查!" | tee -a $LOG_FILE
21 fi
22 else
23 echo "===== $server 配置更新失败 =====" | tee -a $LOG_FILE
24 fi
25 done
26
27 echo "===== 批量部署结束($(date)) =====" | tee -a $LOG_FILE
28 }
29
30 # 执行主函数
31 main
通过 openssl s_client 命令远程验证证书是否生效(返回 Verify return code: 0 表示验证通过),确保部署结果符合预期。
若需部署多个域名的证书,可将 DOMAIN 变量改为数组(如 DOMAINS=("a.com" "b.com") ),并在循环中遍历处理;若目标服务器使用 Apache 或 IIS,需修改配置文件路径与服务重启命令(如 httpd -t 、 systemctl restart httpd )。
脚本需完善错误捕获(如 set -e 命令在关键步骤中断执行),并通过日志文件( $LOG_FILE )记录每一步操作结果,便于事后排查问题(如证书传输失败可能是网络波动,配置错误可能是路径拼写错误)。
4. 自动化调度
结合 crontab 实现定期检查证书有效期(如每月执行一次),当证书剩余有效期不足 30 天时,自动触发部署脚本更新证书,避免证书过期导致服务中断。
使用Shell脚本批量部署SSL证书,通过标准化流程将重复操作自动化,既能减少人为失误,又能将部署效率提升 10 倍以上(从单台服务器 30 分钟缩短至批量部署 10 分钟内)。对于拥有数十甚至上百台服务器的企业而言,这种方式不仅降低了运维成本,更能确保证书管理的规范性与安全性。
在实际应用中,需根据自身网络架构与服务类型调整脚本细节,同时定期测试回滚机制,确保在极端情况下仍能快速恢复业务 —— 毕竟,安全与稳定始终是证书部署的核心目标。
Dogssl.cn拥有20年网络安全服务经验,提供构涵盖国际CA机构Sectigo、Digicert、GeoTrust、GlobalSign,以及国内CA机构CFCA、沃通、vTrus、上海CA等数十个SSL证书品牌。全程技术支持及免费部署服务,如您有SSL证书需求,欢迎联系!