【问题标题】:Trying to prevent direct IP access Nginx SSL试图阻止直接 IP 访问 Nginx SSL
【发布时间】:2018-08-31 10:10:58
【问题描述】:

我一直在这里寻找关于以下代码的答案:

server {
   listen 443 ssl;
   server_name "host.domain.com";

   location / {
            proxy_pass http://host.domain.com;

            }

    ssl_certificate      /etc/httpd/ssl/Sample_StarCert.crt;
    ssl_certificate_key  /etc/httpd/ssl/Sample-NPW.key;

    }

这在很大程度上通过将 SSL 请求反向代理到同一台机器上的 http 服务器来处理 host.domain.com 请求(按设计)来完成它应该做的大部分工作。

当我尝试访问同一站点https://ipaddress时出现问题

现在以这种方式访问​​站点的浏览器会遇到证书警告。在这些情况下,我需要该证书警告消失,或者阻止该尝试,或者重定向到 FQDN 请求。两者都可以。

我一直在尝试使用其他服务器块来完成此操作,但我一直遇到的问题是 SSL 服务器块似乎真的想在处理请求之前开始向浏览器提供证书,这对我来说很奇怪,因为我认为 SNI(与此服务器一起编译)旨在在需要出示证书之前识别请求?我很可能只是误解了这一切是如何运作的,并欢迎指导。

我也尝试了条件语句,但没有成功。有什么想法吗?

【问题讨论】:

  • 证书警告不会消失。 https 需要有效的证书,而您的 IP 地址没有有效的证书。您可以实现的最佳效果是用户接受证书警告之后重定向到 FQDN。
  • 我害怕那个。这真有趣 。 . .我知道 Nginx 在提供证书之前正在查看浏览器请求,因为它为 FQDN 请求提供了一个证书,并为我想要的非 FQDN 请求提供了一个不同的证书,但正如你所指出的,它似乎真的想要在其他任何事情之前完成证书交易,例如阻止我试图阻止的事情(看起来是正确的)。谢谢!

标签: nginx proxy reverse-proxy


【解决方案1】:

我经常看到端口 80 的这种尝试:

server {
    listen 80;
    server_name _;
    return 444;
}

但是,这不适用于 SSL,并导致您的网站在通过域请求时无法访问。

我发现,您可以简单地检查 http 主机是否是 SSL 主服务器块中的服务器名称,如下所示:

server {
    listen 443 ssl;
    server_name YOUR_DOMAIN;
    index index.php index.html;
    root /var/www/html/;

    # block direct IP access
    if ($http_host != $server_name) {
        return 444;
    }
}

如果您喜欢某种一致性,这种尝试也适用于 HTTP。

【讨论】:

    猜你喜欢
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多