nginx:如何防止完全命名的 SSL 服务器块充当所有 SSL 的包罗万象

num*_*407 19 ssl nginx

我有一个带有许多虚拟服务器的 Web 服务器。其中只有 1 个是 SSL。问题是,因为没有包罗万象的服务器块侦听 SSL,对其他站点的任何 https 请求都由 1 SSL 块提供服务。

我的配置基本上是这样的:

# the catch all
server {
  listen 80 default;

  # I could add this, but since I have no default cert, I cannot enable SSL,
  # and this listen ends up doing nothing (apparently).
  # listen 443; 

  server_name _;
  # ...
}

# some server
server {
  listen 80;
  server_name server1.com;
  # ...
}

# some other server ...
server {
  listen 80;
  server_name server2.com;
  # ...
}

# ... and it's https equivalent
server {
  listen 443;
  ssl on;
  server_name server2.com;
  # ...
}
Run Code Online (Sandbox Code Playgroud)

现在因为 443 没有默认监听器,像这样的请求https://server1.com最终将由server2.comhttps 块提供服务。这遵循的逻辑server_name的文档。

如果不匹配,将根据以下顺序使用配置文件中的 server { ... } 块:

  1. 具有匹配监听指令的服务器块标记为 [default|default_server]
  2. 具有匹配监听指令的第一个服务器块(或隐式监听 80;)

这个问题的首选解决方案是什么?我是否需要为我的捕获所有服务器块设置虚拟证书,以便我可以监听 443 并处理错误的请求?是否有我不知道的参数强制与 精确主机名匹配server

Dav*_*rtz 9

理想情况下,除非主机名匹配,否则我希望 nginx 根本不提供 https,或者让它重定向到同一主机上的 http。

两者都不可能。来自客户端的连接到https://foo.example.com/不能被任何东西接受,除了以“foo.example.com”作为其名称之一的 SSL 证书。在接受 SSL 连接之前没有机会重定向。

如果您为每个站点配置 SSL,单击证书错误的用户将获得他们请求的站点。如果您为 SSL 配置了一个仅提供错误页面的“全能”站点,并为应该支持 SSL 的站点配置了基于名称的虚拟主机,则可以向客户端提供错误页面。

SSL 和 HTTP 虚拟主机不能很好地结合在一起。

  • “来自客户端的连接到 https://foo.example.com/ 不能被任何东西接受,除了以“foo.example.com”作为其名称之一的 SSL 证书。” - 这是不正确的,服务器将接受请求,由客户端来验证请求的 DN 是否与服务器证书 DN 匹配。 (3认同)

小智 5

唯一的方法是创建一个自签名 SSL 证书并使用它来控制传入的 https 请求。您可以通过本文中概述的几个简单步骤来创建自签名 SSL 证书。

假设您创建了一个文件名为 server.crt 的自签名证书。然后,您将在 nginx 配置中附加以下内容:

server {
    listen  443;

    ssl    on;
    ssl_certificate         /etc/nginx/ssl/server.crt;
    ssl_certificate_key     /etc/nginx/ssl/server.key;

    server_name server1.com;

    keepalive_timeout 60;
    rewrite ^       http://$server_name$request_uri? permanent;
}
Run Code Online (Sandbox Code Playgroud)

您仍然会收到浏览器 SSL 警告消息,但至少您可以控制接下来发生的事情。

  • 我同意这一点。浏览器存在问题,显示有关不受信任的证书的警告消息,但如果您只是试图阻止用户转到 https://<ip-address> 获取服务器,那么您的真实虚拟主机之一(无效因为主机名不匹配),那么您最好为他们提供无效的自签名虚拟证书。这告诉他们“这里没有什么可看的,甚至没有来自其他主机的证书”。 (2认同)