是否应有一个明确的捕获所有 NGINX `服务器` 块来拒绝服务器**未**提供服务的域的 HTTPS 请求?

是否应有一个明确的捕获所有 NGINX `服务器` 块来拒绝服务器**未**提供服务的域的 HTTPS 请求?

我看到的最常见的 NGINX 配置是下面的配置,它确保所有相关的 HTTP 请求都被重定向,不相关的请求被忽略,但通常我只看到一个server块来处理 HTTPS,它主要是所有 HTTPS 请求的隐式默认服务器,不管Host标头说什么。(提醒自己。

我刚刚了解到,无论出于何种原因,域名都可能被解析为错误的 IP 地址,因此请求可能会到达错误的服务器(例如,123)。 根据 HTTPS 规范 (RFC 2818, “通过 TLS 进行 HTTPS”)1,必须使用服务器证书中的域名检查请求的域名(第3. 端点识别),这样不相关请求的问题就不难解决了。

我能想到的支持对不相关请求使用 HTTPS 捕获所有子句的唯一原因是为了防止客户端的 HTTPS 实现不当(这始终是安全的选择)。

[1]:位于顶部RFC 2818,它说它是“已淘汰:9110“。去那里查看更新,但我能找到的关于这个主题的唯一参考资料是在1.4. 本文档已废弃的规范重定向至部分B.1. 与 RFC 2818 的差异附录 B. 与先前 RFC 的差异其中简单地指出:“没有任何“……”

##################
# HTTP catch-all #
##################
server {
   listen      80 default_server;
   listen [::]:80 default_server;

   server_name _;

   return 404;
}

########################## ( see other flavors:
# HTTP-to-HTTPS redirect #   https://serverfault.com/questions/1141066
########################## )
server {
    listen      80;
    listen [::]:80;

    server_name ourdomain.com;

    return 301 https://ourdomain.com$request_uri;
}

#########
# HTTPS #
#########
server {
    listen 443 default_server ssl http2;

    ssl_certificate /path/to/signed_cert_plus_intermediates;
    ssl_certificate_key /path/to/private_key;

    # ... rest of the instructions ...
}

编辑 (2023-08-26)

我目前使用的 catch-all 块来自 Stackoverflow 线程捕获所有无效子域名的 nginx 服务器阻止

#############################
# CATCH-ALL (https & https) #
#############################
                                            
server {                                    
    listen      80  default_server;          
    listen [::]:80  default_server;          
    listen      443 default_server ssl;     
    listen [::]:443 default_server ssl;     
                                            
    ssl_certificate     /some/path/any.crt; 
    ssl_certificate_key /some/path/any.key; 
                                                      
    return 444;
    # silently drop the connection
    # ... or you can define some 
    # landing page here instead
}

自签名虚拟证书和私钥通过以下方式生成

openssl req -nodes -new -x509 -subj "/CN=localhost" \
  -keyout /some/path/any.key \
  -out    /some/path/any.crt

答案1

是的。

server第三个区块最好是不是“默认服务器”,因为客户端的浏览器否则会生成警告,因为服务器的证书与请求的域不匹配。

您可以在第一个服务器块中添加listen 443 ssl default_server;- 您需要提供一个ssl_certificatessl_certificate_key

您可以重复使用其他网站的凭据。客户端的浏览器仍会生成警告(这是无法避免的),但如果用户仍然点击,他们将获得返回代码而不是您的网站。

相关内容