nginx:如何防止确切命名的SSL服务器块充当所有SSL的捕获

Modified on: Tue, 20 Aug 2019 04:00:03 +0800

我有一个包含许多虚拟服务器的Web服务器。其中只有一个是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;
  # ...
}

现在由于443没有默认侦听器,https://server1.com之类的请求最终将由server2.com https块提供。这遵循文档server_name的逻辑。

  

如果没有匹配,则配置中的服务器{...}阻止
  文件将根据以下顺序使用:

  
  

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

此问题的首选解决方案是什么?我是否需要为我的catch服务器块设置虚拟证书,这样我才能收听443并处理错误的请求?是否有一个我不知道的参数强制确切的主机名与server匹配?

最佳答案

  

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

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

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

SSL和HTTP虚拟主机不能很好地协同工作。


相关问答

添加新评论