核心是三层边界:域名级证书绑定、运行时策略解耦、文件级权限管控;每个租户须独占server块并显式指定专属证书路径,禁用default_server,设ip兜底块return 444,证书按租户分目录且私钥权限600,tls参数与限流日志均需按租户独立配置。

在 Nginx 中实现多租户 SSL 证书与安全策略隔离,核心不是“堆配置”,而是建立三层边界:域名级证书绑定、运行时策略解耦、文件级权限管控。只要每个租户不共享证书路径、不共用 server 块、不混用 TLS 参数,就能避免证书串出、策略污染和审计风险。
为每个租户单独定义 HTTPS server 块
不能把多个租户域名写进同一个 server_name 指令里,也不能让不同租户复用同一组 ssl_certificate 指令。必须严格一一对应:
- 每个租户一个独立的 server 块,例如:
server_name tenant-a.example.com;和server_name tenant-b.example.net;必须分属不同块 - 每个块内显式声明专属证书路径:
ssl_certificate /etc/nginx/ssl/tenant-a/fullchain.pem;和ssl_certificate_key /etc/nginx/ssl/tenant-a/privkey.pem; - 所有租户块都不加
default_server标识,防止 IP 直连时意外暴露某个租户证书
设置专用兜底 server 阻断非法直连
当攻击者用 https://192.168.1.100 这类纯 IP 方式访问时,Nginx 默认会返回第一个加载的 HTTPS server 的证书——这极易泄露租户域名。必须主动拦截:
- 在
http{}块最上方(或单独 include 文件)添加兜底块,且必须带default_server - 该块的
server_name设为空字符串""或通配符_,证书使用仅含服务器 IP 的自签名证书(CN 和 SAN 均为 IP) - 响应直接关闭连接:
return 444;,不发任何 HTTP 状态或 TLS 证书 - 确保该块加载顺序早于所有租户块(按文件字典序或 include 顺序控制)
按租户物理隔离证书与私钥文件
证书泄漏常源于路径误配或权限失控,而非配置语法错误:
- 为每个租户建独立子目录:
/etc/nginx/ssl/tenant-a/、/etc/nginx/ssl/tenant-b/ - 私钥权限严格设为
600,所属用户设为 nginx 运行用户(如www-data),禁止组和其他用户读取 - Nginx 配置中禁用通配路径(如
/etc/nginx/ssl/*.key),必须写绝对路径 - 推荐配合
include /etc/nginx/tenants/tenant-a.conf;分片管理,便于 CI/CD 自动化部署与审计追溯
各租户 TLS 策略与运行时行为独立定制
安全策略不能全局统一,否则无法满足合规差异或业务特性:
-
ssl_protocols、ssl_ciphers、ssl_prefer_server_ciphers等指令必须放在各 server 块内,不可上提至 http 块 - 限流按租户建 zone:
limit_req_zone $server_name zone=tenant_a_rate:10m rate=100r/m;,再在对应块中调用 - 日志格式与路径分离:
access_log /var/log/nginx/tenant-a-access.log tenant_log;,log_format 中加入$server_name或$http_x_tenant_id - 启用 OCSP 装订提升性能:
ssl_stapling on; ssl_stapling_verify on;,但需确保上游 CA 支持并配置正确验证链











