在Nginx中实现SSL证书的动态加载和更新可以避免服务重启导致的连接中断,提高服务可用性。以下是几种实现方法:
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
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
sudo apt-get install certbot python3-certbot-nginx
# 测试自动续期
sudo certbot renew --dry-run
# 设置crontab自动续期
0 12 * * * /usr/bin/certbot renew --quiet
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;
# 其他配置...
}
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
}
}
/var/log/nginx/error.log
通过以上方法,您可以实现Nginx SSL证书的动态加载和更新,确保服务不间断运行。