Nginx 从另一台服务器选择 TLS 版本

Nginx 从另一台服务器选择 TLS 版本

nginx.conf:

events {
}

http {
    server {
        server_name {domain};
        listen 443 ssl;
        ssl_protocols TLSv1.2;
        ssl_certificate {path}.pem;
        ssl_certificate_key {path}.pem;
        return 200 'Success';
    }

    server {
        server_name _;
        listen 443 ssl default_server;
        ssl_protocols TLSv1.1;
        ssl_certificate {path}.pem;
        ssl_certificate_key {path}.pem;
        return 404 'Domain not found';
    }
}

输出nginx -V

nginx version: nginx/1.16.1
built with OpenSSL 1.1.1c  28 May 2019 (running with OpenSSL 1.1.1d  10 Sep 2019)
TLS SNI support enabled
configure arguments: {snipped}

输出openssl version

OpenSSL 1.1.1d  10 Sep 2019

使用此设置,通过 TLS 1.1 连接访问 {domain} 时会显示“成功”。Nginx 到底为什么会这样?我该如何停止?

答案1

这是因为 TLS 设置为在端口 443 上的连接器中包含该协议,正如您在该端口连接器上配置该协议一样。TLS 设置为允许 v1.1 连接。
虚拟主机的选择仅基于服务器名称。
要停止它,您通常只为该端口启用 tlsv1.2 和 v1.3。然后客户端会收到正确的 SSL 错误,提示不支持其协议。
如果您想在客户端不提供 1.2 时阻止使用特定的 vhost,您可以在相应的 vhost 中包含一个重写规则,该规则根据变量的值进行重写$ssl_protocol。在这种情况下,您的服务器表现不佳,因为它完成了握手,然后在应用程序级别返回错误。但它会执行您尝试使用上述配置执行的操作。

我刚刚发现 OpenSSL 1.1.1 有一个功能 (SSL_CTX_set_client_hello_cb),(web) 服务器可以使用该功能根据主机名限制 TLS 版本。
但是据我所知,nginx 目前尚未实现此功能。

相关内容