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

最新下载

热门教程

Nginx 证书隔离:如何配置基于 Server 块的独立 SSL 容器 使多域名证书在同一 IP 的完美并存

时间:2026-06-19 09:11:47 编辑:袖梨 来源:一聚教程网

关键在于为每个域名配置独立的server块,分别绑定专属SSL证书、精确server_name及正确路径;Nginx按SNI匹配证书,需用openssl验证-subject与servername一致,泛域名证书仅限同主域,老旧客户端无SNI时依赖default_server兜底。

要让多个域名在同一个 IP 上各自使用专属 SSL 证书,关键不是“共享配置”,而是为每个域名建一个独立的 server 块——每个块就是一套完整的 HTTPS 环境,证书、域名、监听参数全部绑定,互不干扰。

每个域名配一个独立 server 块

不能把 site-a.com 和 site-b.net 写进同一个 server 里共用证书,否则 Nginx 只会加载最后一个 ssl_certificate 指令的值,导致证书错配。必须分开写:

  • 每个块都写 listen 443 ssl http2; —— ssl 参数不可省,否则证书不加载
  • server_name 必须精确列出该证书覆盖的所有主机名,比如 site-a.com www.site-a.com
  • ssl_certificatessl_certificate_key 路径必须指向该域名对应的 PEM 文件,不能复用或拼错

证书路径与域名严格一一对应

Nginx 启动时不校验证书文件是否存在或是否匹配域名,但运行时会按路径硬加载。一旦路径错误、权限不对或文件缺失,对应域名的 HTTPS 请求就会失败(常见表现为连接重置、浏览器报“证书无效”)。

  • 推荐用 Certbot 分别申请:比如 certbot --nginx -d site-a.comcertbot --nginx -d site-b.net
  • 证书目录建议按域名隔离,例如:/etc/nginx/ssl/site-a.com//etc/nginx/ssl/site-b.net/
  • 泛域名证书(*.example.com)只对同主域子域有效,无法用于 other.net

处理无 SNI 的老旧请求

部分旧客户端(如 Android 4.4 以下、某些嵌入式设备)不发 SNI 字段,Nginx 会回落到第一个定义的 server 块,或显式标记的 default_server 块。

  • 把最常用站点的块放在配置文件最前面,降低误配概率
  • 也可显式声明兜底块:listen 443 ssl http2 default_server;
  • 兜底块的 server_name _; 是惯用写法,建议返回 return 444; 主动断连,避免提供错误证书引发警告

验证证书是否按域名正确返回

别只靠浏览器访问测试,缓存和中间件可能干扰判断。用 OpenSSL 直接测 TLS 层行为:

  • openssl s_client -connect your.ip:443 -servername site-a.com -showcerts 2>/dev/null | openssl x509 -noout -subject → 应显示 CN = site-a.com
  • -servername site-b.net → 应返回另一张证书的 subject
  • 确认每张证书的 SAN 字段包含对应 server_name 中所有域名(包括 www 和裸域)

热门栏目