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 目前尚未实现此功能。