插件窝 干货文章 如何使用Nginx进行SSL证书的动态加载和更新

如何使用Nginx进行SSL证书的动态加载和更新

证书 Nginx 更新 CERT 495    来源:    2025-04-13

Nginx SSL证书动态加载与更新方案

概述

在Nginx中实现SSL证书的动态加载和更新可以避免服务重启导致的连接中断,提高服务可用性。以下是几种实现方法:

方法一:使用Nginx的reload命令

基本流程

  1. 将新证书文件上传到服务器
  2. 替换旧证书文件
  3. 执行 nginx -s reload 命令

优点

  • 简单直接
  • 不会中断现有连接

实现脚本示例

#!/bin/bash

# 定义证书路径
CERT_PATH="/etc/nginx/ssl/cert.pem"
KEY_PATH="/etc/nginx/ssl/key.pem"

# 备份旧证书
cp $CERT_PATH ${CERT_PATH}.bak
cp $KEY_PATH ${KEY_PATH}.bak

# 复制新证书
cp /tmp/new_cert.pem $CERT_PATH
cp /tmp/new_key.pem $KEY_PATH

# 重新加载Nginx配置
nginx -s reload

# 验证新证书
echo | openssl s_client -connect yourdomain.com:443 2>/dev/null | openssl x509 -noout -dates

方法二:使用Nginx的OCSP Stapling动态更新

配置示例

ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 valid=300s;
resolver_timeout 5s;

定期更新脚本

#!/bin/bash
while true; do
    # 强制OCSP更新
    openssl ocsp -issuer /path/to/ca.pem -cert /path/to/cert.pem -url http://ocsp.example.com -respout /path/to/ocsp.resp
    nginx -s reload
    sleep 86400 # 每天更新一次
done

方法三:使用Certbot自动更新Let's Encrypt证书

安装Certbot

sudo apt-get install certbot python3-certbot-nginx

自动续期配置

# 测试自动续期
sudo certbot renew --dry-run

# 设置crontab自动续期
0 12 * * * /usr/bin/certbot renew --quiet

Nginx配置示例

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # 其他配置...
}

方法四:使用Lua脚本动态加载证书(OpenResty)

配置示例

server {
    listen 443 ssl;

    ssl_certificate_by_lua_block {
        local ssl = require "ngx.ssl"

        -- 从数据库或文件动态获取证书
        local cert = get_cert_from_storage()
        local key = get_key_from_storage()

        -- 设置证书
        local ok, err = ssl.set_der_cert(cert)
        if not ok then
            ngx.log(ngx.ERR, "failed to set cert: ", err)
            return
        end

        local ok, err = ssl.set_der_priv_key(key)
        if not ok then
            ngx.log(ngx.ERR, "failed to set key: ", err)
            return
        end
    }
}

最佳实践建议

  1. 监控证书有效期:设置监控系统检查证书到期时间
  2. 自动化流程:将证书更新过程自动化
  3. 备份机制:更新前备份旧证书
  4. 验证机制:更新后验证新证书是否生效
  5. 使用证书管理工具:如HashiCorp Vault、Cert-Manager等

注意事项

  • 确保新证书文件权限正确(通常为root:root,600权限)
  • 更新后检查Nginx错误日志 /var/log/nginx/error.log
  • 对于高流量站点,考虑在低峰期执行更新
  • 使用HTTP/2时,某些客户端可能会缓存证书

通过以上方法,您可以实现Nginx SSL证书的动态加载和更新,确保服务不间断运行。