Nginx的每个服务器使用不同的TLS协议

我为两个TLS虚拟主机“example.one”和“example.two”configuration了两个不同的证书,为Nginxconfiguration。

我需要为第一个安装TLS1.0 +,第二个安装TLS1.2。 然而,第二个(example.two)configuration忽略ssl_protocols指令,并从第一个服务器指令中获取ssl_procolols。

所以两个服务器指令都使用第一个configuration的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 ... } 

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

只有相关的信息,我发现在这里 。 它说,Openssl负责。

难道我做错了什么 ? 还是有这个解决方法? (除了服务器指令分开的IP地址,但我不想回到石器时代)

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

这是如何SSL的作品。 SSL首先创建连接,然后执行SNI。 Nginx会选择一个ssl设置(比如在默认的服务器配置中)来创建ssl连接。 如果该配置没有指定某些ssl协议,则该协议将不会被使用。

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

您可以尝试在默认服务器配置中指定ssl协议的联合集合,并在每个服务器配置中禁用它们中的一些。 我试过这个,它的工作。 但我没有测试每一个可能的情况。

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

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

 ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256'; 

而不是ssl_protocols TLSv1.2; 会做的伎俩。

这似乎是一个在Nginx中的错误。 我也发布了这个答案在https://serverfault.com/a/827794/318927

它始终只使用第一个server块的ssl_protocols指令,并忽略任何后续的server块。 在我的情况下,我有很多虚拟服务器在同一个实例上运行,所以我使用nginx -T命令来显示完整的组合配置,找出哪个服务器块是“第一”,因为我已经把它分成许多单独的配置文件。

在写这篇文章的时候,我正在Ubuntu 14.04.5上用nginx安装ondrej/nginx PPA。 具体来说,我正在运行使用OpenSSL 1.0.2j构建的nginx 1.10.2。

输出nginx -V

 nginx version: nginx/1.10.2 built with OpenSSL 1.0.2j 26 Sep 2016 TLS SNI support enabled configure arguments: --with-cc-opt='-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_spdy_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module --add-dynamic-module=/build/nginx-8xB1_y/nginx-1.10.2/debian/modules/nginx-auth-pam --add-dynamic-module=/build/nginx-8xB1_y/nginx-1.10.2/debian/modules/nginx-dav-ext-module --add-dynamic-module=/build/nginx-8xB1_y/nginx-1.10.2/debian/modules/nginx-echo --add-dynamic-module=/build/nginx-8xB1_y/nginx-1.10.2/debian/modules/nginx-upstream-fair --add-dynamic-module=/build/nginx-8xB1_y/nginx-1.10.2/debian/modules/ngx_http_substitutions_filter_module 

作为你的解决方法,我建议通过安东尼回答: https : //stackoverflow.com/a/37511119/1446479

你是否使用Dotdeb包中的nginx? 如果是的话,我认为这是1.6.x版的nginx-common包的Dotdeb版本中的错误。

我在ubuntu(nginx 1.6.2-1〜dotdeb.0 ,openssl 1.0.1-4ubuntu5.20)有类似的配置,我无法使用TLSv1.1或TLSv1.2访问我的网站。 配置:

  ssl_protocols TLSv1.2; 

使我的网站不可用。 从默认存储库下载到nginx 1.4.6-1ubuntu3.1解决了我的问题,现在TLSv1.2再次工作。 所以我认为你的问题不是关于“使用不同的ssl_protocoles”,而是关于“在nginx 1.6.x〜dotdeb中使用TLSv.1.1和TLSv1.2”。

https://www.dotdeb.org/2014/06/30/nginx-1-6-0-has-been-updated-for-wheezy-and-squeeze/#comment-32895

服务器名称是根据请求确定的(如果serverNameIndication被支持和存在,或者甚至来自HTTP请求,则来自TLS扩展)。 所以在握手时间或之前不可能知道客户端连接了什么服务器,因此不能使用什么设置。

更新: 在这里 ,来自nginx团队的人解释了为什么这是不可能的(因为我写的确切原因)。