如何让 Nginx 拒绝主机为 IP 或与 server_name 不匹配的 SSL/TLS 连接

如何让 Nginx 拒绝主机为 IP 或与 server_name 不匹配的 SSL/TLS 连接

对于我们的 PCI 合规性,我们开始遇到以下故障:

在此处输入图片描述

我们使用 Nginx 作为 Web 服务器。使用我们的任何域名访问 Web 服务器时,我们server_name在 Nginx 配置中都有正确的值,因此可以提供正确的证书。安全扫描也会直接扫描服务器的 IP 地址,并被其中一个阻止server。我们如何才能防止这种情况被阻止或以适当的方式做出响应,以免在安全扫描中出现此错误?

我找到了一些想法像这样返回 404,但这无济于事,因为 CN 仍然与 IP 地址不匹配。

这是捕获请求的服务器块的样子(它实际上是从旧域重定向到新域,但正如你所见,它没有明确default_server列出文档):

server {
    listen 443 ssl;
    server_name xxxx.de www.xxxx.de;

    ssl_protocols TLSv1.1 TLSv1.2;
    ssl_certificate /xxxx/ssl-bundle.crt;
    ssl_certificate_key /xxxx/xxxx.de.key;

    return 301 https://www.yyyy.de;
}

谢谢

答案1

如果您希望非 SNI 客户端默认使用兼容的服务器,则必须添加显式的 default_server。请注意,根据nginx 文档,第一个隐式地用作默认值:

如果没有任何指令具有 default_server 参数,则具有地址:端口对的第一个服务器将成为该对的默认服务器。

有一些半适当的 http 状态代码来表示无法对给定的服务器名称产生响应,但在提供空的(CN 中没有 FQDN)自签名证书后简单地断开连接最有可能确保验证工具忽略该证书:

server {
  listen 443 ssl default_server;
  server_name _;
  ssl_protocols TLSv1.1 TLSv1.2;
  ssl_certificate /etc/ssl/snakeoil.crt;
  ssl_certificate_key /etc/ssl/private/snakeoil.key;
  return 444;
}

答案2

您需要将 IP 地址添加为 http 端口 80 服务器的服务器名称,然后使用

return 301 https://site$request_uri;

例如:

server {
    listen 80;
    server_name xxxx.de www.xxxx.de 111.112.113.114;

    return 301 https://www.yyyy.de$request_uri;
}

编辑:这实际上并没有回答您拒绝连接的问题,而是解决问题,因此它应该将查询正确地重定向到您的网站。

相关内容