怎样用脚本自动生成Nginx SSL证书?

wen 实用脚本 1

本文目录导读:

怎样用脚本自动生成Nginx SSL证书?

  1. 使用Let's Encrypt(推荐)
  2. 使用acme.sh(轻量级方案)
  3. 自签名证书(测试环境)
  4. 完整的自动化部署脚本
  5. 定时自动续期
  6. 注意事项

我来介绍几种自动生成和更新Nginx SSL证书的方法:

使用Let's Encrypt(推荐)

安装Certbot

# Ubuntu/Debian
sudo apt update
sudo apt install certbot python3-certbot-nginx
# CentOS/RHEL
sudo dnf install certbot python3-certbot-nginx

自动获取证书脚本

#!/bin/bash
DOMAIN="yourdomain.com"
EMAIL="admin@yourdomain.com"
# 申请证书
sudo certbot --nginx -d $DOMAIN --email $EMAIL --agree-tos --non-interactive
# 验证证书是否成功
if [ -f "/etc/letsencrypt/live/$DOMAIN/fullchain.pem" ]; then
    echo "SSL证书生成成功!"
else
    echo "证书生成失败!"
    exit 1
fi

自动续期脚本

#!/bin/bash
# 续期所有证书
sudo certbot renew --nginx --non-interactive
# 重启Nginx应用新证书
sudo systemctl reload nginx
# 记录日志
echo "$(date): 证书续期完成" >> /var/log/certbot-renew.log

使用acme.sh(轻量级方案)

安装acme.sh

curl https://get.acme.sh | sh

自动生成证书脚本

#!/bin/bash
DOMAIN="yourdomain.com"
EMAIL="admin@yourdomain.com"
# 设置默认CA为Let's Encrypt
~/.acme.sh/acme.sh --set-default-ca --server letsencrypt
# 申请证书
~/.acme.sh/acme.sh --issue -d $DOMAIN \
    --nginx \
    --email $EMAIL \
    --keylength ec-256
# 安装证书到Nginx目录
~/.acme.sh/acme.sh --install-cert -d $DOMAIN \
    --key-file /etc/nginx/ssl/$DOMAIN.key \
    --fullchain-file /etc/nginx/ssl/$DOMAIN.crt \
    --reloadcmd "systemctl reload nginx"
echo "SSL证书已安装到 /etc/nginx/ssl/"

自签名证书(测试环境)

自动生成自签名证书脚本

#!/bin/bash
DOMAIN="localhost"
DAYS=365
KEY_SIZE=2048
SSL_DIR="/etc/nginx/ssl"
# 创建SSL目录
sudo mkdir -p $SSL_DIR
# 生成私钥
sudo openssl genrsa -out $SSL_DIR/$DOMAIN.key $KEY_SIZE
# 生成CSR(证书签名请求)
sudo openssl req -new -key $SSL_DIR/$DOMAIN.key \
    -out $SSL_DIR/$DOMAIN.csr \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/OU=IT/CN=$DOMAIN"
# 生成自签名证书
sudo openssl x509 -req -days $DAYS \
    -in $SSL_DIR/$DOMAIN.csr \
    -signkey $SSL_DIR/$DOMAIN.key \
    -out $SSL_DIR/$DOMAIN.crt
# 设置权限
sudo chmod 600 $SSL_DIR/$DOMAIN.key
sudo chmod 644 $SSL_DIR/$DOMAIN.crt
echo "自签名证书已生成:"
echo "证书:$SSL_DIR/$DOMAIN.crt"
echo "私钥:$SSL_DIR/$DOMAIN.key"

完整的自动化部署脚本

#!/bin/bash
# 配置变量
DOMAIN="yourdomain.com"
EMAIL="admin@yourdomain.com"
NGINX_CONFIG="/etc/nginx/conf.d/$DOMAIN.conf"
SSL_DIR="/etc/nginx/ssl"
# 创建SSL目录
echo "创建SSL目录..."
mkdir -p $SSL_DIR
# 安装Certbot
echo "安装Certbot..."
if command -v apt-get &> /dev/null; then
    apt-get update
    apt-get install -y certbot python3-certbot-nginx
elif command -v yum &> /dev/null; then
    yum install -y certbot python3-certbot-nginx
fi
# 生成Nginx配置(HTTP版本用于验证)
echo "创建Nginx配置..."
cat > $NGINX_CONFIG << EOF
server {
    listen 80;
    server_name $DOMAIN;
    root /var/www/html;
    index index.html;
}
EOF
# 启动Nginx
systemctl start nginx
systemctl enable nginx
# 获取SSL证书
echo "获取SSL证书..."
certbot --nginx -d $DOMAIN --email $EMAIL --agree-tos --non-interactive
if [ $? -eq 0 ]; then
    echo "SSL证书获取成功!"
else
    echo "SSL证书获取失败,尝试手动配置..."
    exit 1
fi
# 更新Nginx配置为HTTPS
echo "更新Nginx配置..."
cat > $NGINX_CONFIG << EOF
server {
    listen 443 ssl http2;
    server_name $DOMAIN;
    ssl_certificate /etc/letsencrypt/live/$DOMAIN/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/$DOMAIN/privkey.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers on;
    location / {
        root /var/www/html;
        index index.html;
    }
}
# HTTP重定向到HTTPS
server {
    listen 80;
    server_name $DOMAIN;
    return 301 https://\$server_name\$request_uri;
}
EOF
# 测试并重载Nginx
nginx -t && systemctl reload nginx
echo "部署完成!"
echo "访问 https://$DOMAIN 查看效果"

定时自动续期

# 添加到crontab
sudo crontab -e
# 添加以下行(每天检查一次)
0 0,12 * * * /usr/bin/certbot renew --quiet --nginx --non-interactive && systemctl reload nginx

注意事项

  1. Let's Encrypt证书有效期为90天,需要定期续期
  2. 生产环境务必使用有效的域名,并确保DNS解析正确
  3. 防火墙需要开放443端口
  4. 定期检查证书过期时间
    openssl x509 -enddate -noout -in /path/to/certificate.crt

选择哪种方法取决于你的具体需求:

  • 生产环境:推荐Let's Encrypt或acme.sh
  • 测试环境:可以用自签名证书
  • 内网环境:考虑搭建内部CA服务器

抱歉,评论功能暂时关闭!