文档中心
Nginx濡備綍鍔ㄦ€侀儴缃插SSL璇佷功锛?绉嶅疄鐢ㄦ柟妗堣瑙?txt
时间 : 2025-09-27 16:26:42浏览量 : 1

在当今互联网环境中,SSL/TLS加密已成为网站标配。随着业务发展,很多企业需要在同一台服务器上部署多个网站,每个网站都需要独立的SSL证书。本文将详细介绍Nginx动态部署多SSL证书的3种实用方案,帮助您高效管理HTTPS服务。
为什么需要多SSL证书部署?
想象一下你经营着一家网络托管公司,客户A的域名是example.com,客户B的域名是test.org。他们都要求使用HTTPS协议,且各自拥有不同的SSL证书。传统的做法是为每个域名配置单独的server块:
```nginx
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/example.com.crt;
ssl_certificate_key /path/to/example.com.key;
其他配置...
}
server_name test.org;
ssl_certificate /path/to/test.org.crt;
ssl_certificate_key /path/to/test.org.key;
```
这种方式在小规模场景下可行,但当有上百个域名时,维护起来就非常麻烦。每次新增或更新证书都需要修改Nginx配置并重载服务。
方案一:使用SNI(服务器名称指示)技术
SNI是TLS协议的扩展功能,允许客户端在握手阶段就告知服务器要访问的域名。这样服务器就能根据域名选择对应的证书。
具体实现步骤:
1. 确保Nginx支持SNI:
```bash
nginx -V | grep -i sni
```
如果输出中包含`TLS SNI support enabled`则说明已支持。
2. 准备证书目录结构:
/etc/nginx/ssl/
├── example.com
│ ├── fullchain.pem
│ └── privkey.pem
└── test.org
├── fullchain.pem
└── privkey.pem
3. Nginx配置示例:
listen 443 ssl default_server;
通配符匹配所有域名
server_name ~^(?
动态加载证书路径
ssl_certificate /etc/nginx/ssl/$domain/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/$domain/privkey.pem;
SSL通用配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
其他通用配置...
*优点*:配置简单直观,新增域名只需上传对应证书文件到指定目录即可。
*缺点*:需要提前规划好目录结构,不适合超大规模场景(如数千个域名)。
方案二:结合Lua脚本动态加载
对于更复杂的场景(如从数据库加载证书),可以使用OpenResty(基于Nginx的增强版)配合Lua脚本实现。
实现步骤:
1. 安装OpenResty:
```bash
wget https://openresty.org/download/openresty-1.19.9.1.tar.gz
tar zxvf openresty-*.tar.gz
cd openresty-*
./configure && make && sudo make install
2. 编写Lua脚本 (`certs.lua`):
```lua
local _M = {}
-- 模拟从数据库获取证书(实际应用中替换为真实数据源)
local certs_db = {
["example.com"] = {
cert = "/path/to/example.com.crt",
key = "/path/to/example.com.key"
},
["test.org"] = {
cert = "/path/to/test.org.crt",
key = "/path/to/test.org.key"
function _M.get_cert(domain)
return certs_db[domain]
end
return _M
3. Nginx配置:
http {
lua_shared_dict cert_cache 10m;
Lua共享内存缓存
init_by_lua_block {
certs = require "certs"
listen 443 ssl;
ssl_certificate_by_lua_block {
local domain = ngx.var.server_name
local cert_info = certs.get_cert(domain)
if not cert_info then
ngx.log(ngx.ERR, "no cert found for: ", domain)
return ngx.exit(444)
end
-- 设置找到的证书
ngx.var.ssl_certificate = cert_info.cert
ngx.var.ssl_certificate_key = cert_info.key
}
SSL通用配置... } }
*优点*:灵活性极高,可以从任意数据源获取证书信息。
*缺点*:实现复杂度较高,需要熟悉Lua编程。
方案三:使用acme.sh自动管理Let's Encrypt证书
对于个人站长或小型企业来说,"Let's Encrypt + acme.sh"组合是最便捷的多证书管理方案。
具体操作:
1. 安装acme.sh:
curl https://get.acme.sh | sh -s email=my@example.com
2. 批量申请通配符证书:
DNS API方式验证(以Cloudflare为例)
export CF_Key="your_api_key"
export CF_Email="your_email"
acme.sh --issue --dns dns_cf -d example.com -d *.example.com \
-d test.org -d *.test.org \
--keylength ec-256 --ocsp-must-staple --log --reloadcmd "systemctl reload nginx"
3. 自动安装到Nginx:
acme.sh --install-cert -d example.com \
--key-file /etc/nginx/ssl/example.com/key.pem \
--fullchain-file /etc/nginx/ssl/example.com/cert.pem \
--reloadcmd "systemctl reload nginx"
4. 自动化续期:
acme.sh会自动添加cron任务处理续期问题(默认60天续期一次)
5.Nginx基础配置参考方案一即可
*优点*:全自动化管理、免费、支持通配符。
*缺点*:依赖DNS API权限、仅适用于Let's Encrypt体系。
HTTPS性能优化小贴士
无论采用哪种多证书记录方式都要注意性能优化:
1.启用OCSP Stapling
```nginx
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 valid=300s;
resolver_timeout5s;
这可以减少客户端验证时间约200-500ms
2.会话复用优化
ssl_session_cache shared:SSL:50m;
ssl_session_timeout1d;
通过会话复用可以节省TLS握手开销
3.HTTP2优先
listen443 ssl http2;
HTTP2的多路复用特性可以显著提升HTTPS站点性能
常见问题排查Q&A
Q: Chrome浏览器提示"ERR_SSL_VERSION_OR_CIPHER_MISMATCH"怎么办?
A:检查是否遗漏了中间CA证书(fullchain包含完整链)、确认支持的协议版本(TLSv1至少)
Q:Nginx重载后新证书记录不生效?
A:确认文件权限是否正确(chmod400私钥)、检查错误日志(tail-f error.log)
Q:如何测试SNI是否正常工作?
A:使用openssl工具测试:
openssl s_client -connect your.site:443-servername your.site | openssl x509-noout-subject
应该显示对应域名的证书记录而非默认记录
通过以上三种方案的比较可以看出:中小规模推荐方案一+三组合;超大规模或有特殊需求才考虑方案二。实际生产环境中还需要考虑HSTS预加载、CAA记录等安全增强措施。
TAG:nginx如何动态部署多ssl证书,nginx如何配置ssl证书,nginx配置多个ssl证书,nginx 多个,nginx 配置ssl,nginx加ssl