一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Nginx 中如何配置 Nginx 支持多张 SSL 证书同时生效

时间:2026-08-16 12:08:49 编辑:袖梨 来源:一聚教程网

Nginx支持单IP单443端口多域名多SSL证书,依赖SNI技术;需OpenSSL≥1.0.1、启用--with-http_ssl_module,每个域名配独立server块并指定专属证书路径,用openssl s_client验证证书匹配。

Nginx 支持在同一台服务器、同一个 IP 和 443 端口上,为多个域名分别使用不同的 SSL 证书——前提是启用 TLS SNI(Server Name Indication)并正确配置。

核心逻辑很简单:每个域名对应一个独立的 server 块,各自声明 listen 443 sslserver_namessl_certificatessl_certificate_key

只要 Nginx 编译时启用了 --with-http_ssl_module,且底层 OpenSSL 版本 ≥1.0.1(现代系统基本都满足),SNI 就默认可用,无需额外开启开关。


确认 SNI 是否已支持

运行以下命令检查:

nginx -V 2>&1 | grep -i "sni"

如果输出含 TLS SNI support enabled,说明支持;若显示 disabled,需升级 OpenSSL 并重新编译 Nginx(较旧系统才需此步,当前主流发行版如 Ubuntu 22.04+/CentOS 8+ 默认支持)。


配置多个独立 SSL 证书(推荐方式)

为每个域名单独写一个 server 块,路径、证书、域名一一对应:

  1. 确保每个 server_name 值唯一且准确(如 example.comapi.example.com 是两个不同域名)
  2. 证书与私钥路径必须可读,权限建议设为 644(.crt)和 600(.key)
  3. 所有 server 块都监听 443 ssl,不冲突——SNI 会在 TLS 握手阶段自动路由到对应证书

示例:

server {listen 443 ssl;server_name site-a.com www.site-a.com;ssl_certificate /etc/letsencrypt/live/site-a.com/fullchain.pem;ssl_certificate_key /etc/letsencrypt/live/site-a.com/privkey.pem;# 其他配置...}

server { listen 443 ssl; server_name site-b.net api.site-b.net; ssl_certificate /etc/letsencrypt/live/site-b.net/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/site-b.net/privkey.pem;

其他配置...

}


常见误区与注意事项

  1. 不要把多个证书写在同一个 server 块里(如 ssl_certificate cert1.pem; ssl_certificate cert2.pem;)——Nginx 不识别这种写法,会报错或行为异常
  2. 避免用通配符覆盖多个主域(如 *.example.com 只能匹配子域,不能匹配 another.com
  3. 若需同一域名多个证书(如 RSA + ECDSA),可使用 ssl_certificate + ssl_certificate_key 配合 ssl_trusted_certificate 实现双栈,但非“多域名”场景
  4. HTTP/2 要求 ALPN,而 ALPN 依赖 SNI,所以多证书配置天然兼容 HTTP/2

验证是否生效

重启 Nginx 后,用以下命令逐个验证证书是否被正确返回:

openssl s_client -connect site-a.com:443 -servername site-a.com -showcerts 2>/dev/null | openssl x509 -noout -text | grep "Subject:

替换 site-a.com 为你的域名,观察 Subject 中 CN 或 SAN 是否匹配预期证书。

浏览器访问各域名,地址栏锁图标应显示“安全”,点击可查看证书详情,确认签发对象一致。

热门栏目