Nginx 的 ssl_certificate 不支持多个独立域名证书,需通过 SNI + 多个 server 块分别配置;合并证书仅适用于同一域名的证书链(leaf + intermediate),顺序错误或混入多域名证书会导致握手失败。

在 Nginx 中,ssl_certificate 指令本身不支持直接配置多个独立证书文件(比如多个不同域名的完整证书链),但可以通过“合并证书文件”的方式,实现单个 ssl_certificate 指令加载多个域名的证书——这正是 SNI(Server Name Indication)机制下多域名 HTTPS 共享同一 IP 和端口的核心实践方式。
为什么需要合并证书?
Nginx 的 ssl_certificate 只接受一个 PEM 格式文件路径,该文件需包含:
– 域名对应的私钥(可选,若使用 ssl_certificate_key 单独指定则不必包含)
– 域名的公钥证书(即 leaf certificate)
– 中间证书(intermediate CA),按顺序拼接
注意:它不支持数组或多次声明。所以当要为多个域名(如 example.com 和 api.example.com)提供各自独立的证书时,必须借助 SNI + 多个 server 块,每个块用各自的 ssl_certificate 和 ssl_certificate_key —— 这才是标准、安全、推荐的做法。
所谓“多证书合并”,真实场景中仅适用于:
– 同一域名的通配符证书 + 精确证书(如 *.example.com 和 www.example.com)共存(实际仍需 SNI 匹配,Nginx 不自动选)
– 更常见的是:将「主域名证书 + 中间证书」合并成一个文件,确保链完整;而非把多个域名的 leaf 证书硬塞进同一个 PEM 文件(那样会导致 TLS 握手失败或浏览器警告)。
正确合并证书的操作步骤
以部署 example.com 为例,假设你有:
-
example.com.key(私钥) -
example.com.crt(站点证书) -
intermediate.crt(中间 CA,如 Let's Encrypt 的fullchain.pem中除首项外的部分)
执行合并(顺序不能错):
cat example.com.crt intermediate.crt > example.com.chained.crt
然后在 Nginx 配置中使用:
ssl_certificate /path/to/example.com.chained.crt; ssl_certificate_key /path/to/example.com.key;
✅ 这样浏览器能完整构建信任链;❌ 若漏掉中间证书,部分客户端(尤其是旧 Android 或 Java 应用)会提示“证书不可信”。
如何真正支持多个域名(SNI 多证书)
Nginx 1.11.0+ 原生支持 SNI,允许在同一 listen 443 ssl 端口下,为不同 server_name 分配不同证书。这才是“多证书部署”的正解:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.chained.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
# …
}
<p>server {
listen 443 ssl;
server_name api.example.com;
ssl_certificate /etc/nginx/ssl/api.example.com.chained.crt;
ssl_certificate_key /etc/nginx/ssl/api.example.com.key;</p><h1>…</h1><p>}</p>
只要客户端支持 SNI(现代浏览器、curl、Chrome、Firefox 全支持),Nginx 就会在 TLS 握手阶段根据 Client Hello 中的 SNI 字段,选择对应 server 块的证书返回。
常见误区与验证方法
⚠️ 错误做法:
– 把两个域名的 .crt 文件 cat 到一起,当作一个 ssl_certificate 使用 → TLS 握手时只会返回第一个证书,另一个域名无法通过验证。
– 在同一 server 块里写多个 ssl_certificate → Nginx 启动报错 “duplicate directive”。
✅ 正确验证方式:
– 用 OpenSSL 检查服务端实际返回的证书:openssl s_client -connect example.com:443 -servername example.com -showcerts
– 对比输出中的证书 subject 是否匹配预期域名
– 用 SSL Labs Test 扫描,确认链完整性和 SNI 支持状态











