本文目录导读:

我来介绍几种自动生成和更新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
注意事项
- Let's Encrypt证书有效期为90天,需要定期续期
- 生产环境务必使用有效的域名,并确保DNS解析正确
- 防火墙需要开放443端口
- 定期检查证书过期时间:
openssl x509 -enddate -noout -in /path/to/certificate.crt
选择哪种方法取决于你的具体需求:
- 生产环境:推荐Let's Encrypt或acme.sh
- 测试环境:可以用自签名证书
- 内网环境:考虑搭建内部CA服务器