关键在于为每个域名配置独立的server块,分别绑定专属SSL证书、精确server_name及正确路径;Nginx按SNI匹配证书,需用openssl验证-subject与servername一致,泛域名证书仅限同主域,老旧客户端无SNI时依赖default_server兜底。
要让多个域名在同一个 IP 上各自使用专属 SSL 证书,关键不是“共享配置”,而是为每个域名建一个独立的 server 块——每个块就是一套完整的 HTTPS 环境,证书、域名、监听参数全部绑定,互不干扰。
不能把 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_certificate 和 ssl_certificate_key 路径必须指向该域名对应的 PEM 文件,不能复用或拼错Nginx 启动时不校验证书文件是否存在或是否匹配域名,但运行时会按路径硬加载。一旦路径错误、权限不对或文件缺失,对应域名的 HTTPS 请求就会失败(常见表现为连接重置、浏览器报“证书无效”)。
certbot --nginx -d site-a.com 和 certbot --nginx -d site-b.net
/etc/nginx/ssl/site-a.com/ 和 /etc/nginx/ssl/site-b.net/
*.example.com)只对同主域子域有效,无法用于 other.net
部分旧客户端(如 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
server_name 中所有域名(包括 www 和裸域)