试图阻止直接IP访问Nginx SSL

时间:2018-03-22 04:48:16

标签: nginx proxy reverse-proxy

我一直在寻找以下代码的答案:

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;

    }

这可以通过在同一台计算机上针对host.domain.com请求(按设计)反向代理SSL请求来完成大部分工作。

当我尝试访问同一网站https://ipaddress

时出现问题

现在,以这种方式访问​​网站的浏览器面临证书警告。我需要证书警告在这些情况下消失,要么阻止该尝试,要么重定向到FQDN请求。要么没事。

我一直试图用其他服务器块来实现这一点,但我一直遇到的问题是SSL服务器块似乎真的想在处理请求之前开始向浏览器提交证书,这对我来说很奇怪我认为SNI(这个服务器是编译的)是为了在提交证书之前识别请求是必要的吗?我很可能误解了这一切是如何运作的,并欢迎指导。

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

1 个答案:

答案 0 :(得分:0)

我经常看到这种尝试使用 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,如果您更喜欢一些一致性。