Nginx中每台服务器的不同TLS协议

ZZr*_*nZZ 7 ssl https debian openssl nginx

我使用两个不同的证书为两个TLS虚拟主机'example.one'和'example.two'配置了Nginx.

我需要为第一个设置TLS1.0 +,为第二个设置TLS1.2.但是,第二个(example.two)配置忽略ssl_protocols指令并从第一个服务器指令获取ssl_procolols.

因此,两个服务器指令都使用第一个配置的ssl_protocols指令.

server {
    listen          443 default_server ssl spdy;
    server_name     example.one;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    ssl_certificate         /certs/cert-for-example.one.pem;
    ssl_certificate_key     /certs/privkey-for-example.one.pem;


    # another ssl_* directives ...
} 

server {
    listen          443 ssl spdy;
    server_name     example.two;

    ssl_protocols TLSv1.2;

    ssl_certificate         /certs/cert-for-example.two.pem;
    ssl_certificate_key     /certs/privkey-for-example.two.pem;

    # another ssl_* directives ...
} 
Run Code Online (Sandbox Code Playgroud)

我不想使用SSL3,因此TLS SNI应该可以正常工作.而且我不关心没有TLS SNI支持的客户.

只有相关的信息,我找到.它说,Openssl负责.

难道我做错了什么 ?或者有解决方法吗?(除了服务器指令的单独IP地址,但我不想回到石器时代)

我在Debian Wheezy上使用Nginx/1.6.2,OpenSSL 1.0.1e.

Jia*_*ing 5

这就是 ssl 的工作原理。SSL 首先创建连接,然后执行 SNI。Nginx 将选择一项 ssl 设置(例如在默认服务器配置中)来创建 ssl 连接。如果该配置未指定某些 ssl 协议,则根本不会使用该协议。

所以基本上“每服务器 ssl 协议”不会像看起来那样工作。

您可以尝试在默认服务器配置中指定 ssl 协议的联合集,并在每个服务器配置中禁用其中一些协议。我尝试了这个并且成功了。但我并没有测试所有可能的情况。

您可以在这里看到讨论:http://mailman.nginx.org/pipermail/nginx/2014-November/045733.html


小智 5

作为一种解决方法,可以使用ssl_ciphers指令来限制 TLS 协议版本。提供 TLSv1.2 特定的密码套件将有效防止较低 TLS 版本的握手。所以,对于上面的例子,

ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256';
Run Code Online (Sandbox Code Playgroud)

反而ssl_protocols TLSv1.2;会奏效。


Eug*_*its -1

服务器名称根据请求确定(如果支持且存在 ServerNameInduction,则从 TLS 扩展确定,甚至从 HTTP 请求确定)。因此,在握手时或握手之前不可能知道客户端连接到哪个服务器以及因此要使用哪些设置。

更新:这里nginx 团队的人解释了为什么这是不可能的(出于我已经写过的确切原因)。