https 与 sni 两个证书,服务器名称相同但配置相同。我可以使用一个服务器块吗?

https 与 sni 两个证书,服务器名称相同但配置相同。我可以使用一个服务器块吗?

我经常遇到以下问题。

我有一台 nginx 服务器,通过 https 在同一个 IP 和同一个端口上为两个主机名提供服务。每个主机名都有自己的证书。

到目前为止我所做的是进行两种配置:

server {
    listen              443 ssl;
    server_name         www.example1.com;
    ssl_certificate     www.example1.com.crt;
    ssl_certificate_key www.example1.com.key;
    ssl_protocols       ...;
    ssl_ciphers         ...;
    ...
}

server {
    listen              443 ssl;
    server_name         www.example2.com;
    ssl_certificate     www.example2.com.crt;
    ssl_certificate_key www.example2.com.key;
    ssl_protocols       ...;
    ssl_ciphers         ...;
    ...
}

有什么技巧可以仅在一个服务器块中完成此操作吗?

我询问的原因是,两台服务器共享相同的名称和证书配置。

我目前所做的是:

server {
    listen              443 ssl;
    server_name         www.example1.com;
    ssl_certificate     www.example1.com.crt;
    ssl_certificate_key www.example1.com.key;
    include /etc/nginx/common_config/example1_and_2/*;
}

server {
    listen              443 ssl;
    server_name         www.example2.com;
    ssl_certificate     www.example2.com.crt;
    ssl_certificate_key www.example2.com.key;
    include /etc/nginx/common_config/example1_and_2/*;
}

是否可以改进,是否有一些标准建议?如果这已经很好了,那么至少有一条建议可以指导您如何找到这些常见的配置规则吗?

答案1

server_name可以有多个主机名的列表,例如

server_name example.org www.example.org example.com www.example.com;

虽然(自 1.11.0 起)可以在单个server { }块中加载多个证书,但它适用于多种不同类型(例如 RSA 和 ECDSA),而不是多个主机名。但可以在ssl_certificate

自 1.15.9 版本起,使用 OpenSSL 1.0.2 或更高版本时可以在文件名中使用变量:

ssl_certificate $ssl_server_name.crt;
ssl_certificate_key $ssl_server_name.key; 

请注意,使用变量意味着每次 SSL 握手都会加载一个证书,这可能会对性能产生负面影响。

对于提到的性能影响,我不建议这样做,但会将同一块的所有主机名合并server { }到单个证书中,如下所示主题备用名称s(SAN)即可。

相关内容