ssl新闻资讯

文档中心

Nginx濡備綍鍔ㄦ€侀儴缃插SSL璇佷功锛?绉嶅疄鐢ㄦ柟妗堣瑙?txt

时间 : 2025-09-27 16:26:42浏览量 : 1

2Nginx濡備綍鍔ㄦ€侀儴缃插SSL璇佷功锛?绉嶅疄鐢ㄦ柟妗堣瑙?txt

在当今互联网环境中,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