我有一个带有许多虚拟服务器的 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 { ... } 块:
- 具有匹配监听指令的服务器块标记为 [default|default_server]
- 具有匹配监听指令的第一个服务器块(或隐式监听 80;)
这个问题的首选解决方案是什么?我是否需要为我的捕获所有服务器块设置虚拟证书,以便我可以监听 443 并处理错误的请求?是否有我不知道的参数强制与 精确主机名匹配server?
理想情况下,除非主机名匹配,否则我希望 nginx 根本不提供 https,或者让它重定向到同一主机上的 http。
两者都不可能。来自客户端的连接到https://foo.example.com/不能被任何东西接受,除了以“foo.example.com”作为其名称之一的 SSL 证书。在接受 SSL 连接之前没有机会重定向。
如果您为每个站点配置 SSL,单击证书错误的用户将获得他们请求的站点。如果您为 SSL 配置了一个仅提供错误页面的“全能”站点,并为应该支持 SSL 的站点配置了基于名称的虚拟主机,则可以向客户端提供错误页面。
SSL 和 HTTP 虚拟主机不能很好地结合在一起。
小智 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 警告消息,但至少您可以控制接下来发生的事情。
| 归档时间: |
|
| 查看次数: |
7613 次 |
| 最近记录: |