可以,nginx通过tls sni机制支持单ip单443端口多域名多ssl证书;需openssl≥1.0.2、启用--with-http_ssl_module,每个域名配独立server块并指定专属证书路径,用openssl s_client验证证书匹配。

可以在同一个 IP 和 443 端口上为多个域名分别绑定不同的 HTTPS 证书,核心依赖 TLS SNI(Server Name Indication)机制,不需要改端口、也不需要额外 IP。
确认底层环境支持 SNI
Nginx 本身不需手动开启 SNI,但必须满足两个前提:
- OpenSSL 版本 ≥ 1.0.2(推荐 1.1.1+),运行
nginx -V 2>&1 | grep -i openssl查看输出;若显示BoringSSL或版本过低(如 0.9.8),SNI 实际不可用 - Nginx 编译时启用了
--with-http_ssl_module,nginx -V输出中应包含该模块
每个域名配一个独立 server 块
不能把多个域名写进同一个 server 块里共用证书,必须分开定义:
- 每个块都写
listen 443 ssl http2;(ssl关键字不可省) -
server_name精确列出该证书覆盖的全部主机名,例如:server_name example.com www.example.com; -
ssl_certificate和ssl_certificate_key必须指向该域名对应的证书文件,路径要完整、可读、权限正确
证书管理建议
避免路径混乱或误配:
- 用 Certbot 分别申请:如
certbot --nginx -d example.com -d www.example.com,生成统一证书;或为不同主域单独申请,目录隔离(如/etc/letsencrypt/live/site-a.com/) - 泛域名证书(
*.example.com)只对同主域子域有效,不能用于other.net - 不要把多个域名的证书内容合并到一个 PEM 文件——这不是优化,而是错误配置
验证是否生效
别只靠浏览器访问,用 OpenSSL 直接测 TLS 层行为:
-
openssl s_client -connect your.site:443 -servername example.com -showcerts 2>/dev/null | openssl x509 -noout -subject→ 应返回CN = example.com - 换
-servername other.net→ 应返回另一张证书的subject - 不带
-servername参数时,会回落到第一个定义的server块(或显式标记的default_server)











