如何让 Nginx 删除来自错误域的 SSL 请求?

如何让 Nginx 删除来自错误域的 SSL 请求?

所以我有一台只有一个 IP 的服务器,上面有很多网站,全部托管在 nginx 下。下面是非常简化我的实际设置:

server {
    listen 80;
    listen 443 ssl;
    server_name ssl.example.com;
    #...
}

server {
    listen 80;
    server_name nossl.example.com;
    #...
}

如果我连接到 ,ssl.example.com:443一切正常,如预期。
如果我连接到nossl.example.com:443,它会尝试提供 的内容ssl.example.com:443

我已经和解了为什么会发生这种情况(这只是 ssl+nginx 与虚拟服务器的最佳匹配方式),我只需要阻止它从错误的站点发送内容。

除了为我的所有网站购买证书(或颁发自己的证书)或将 SSL 网站推送到自己的 IP 之外,我还有什么选择?nginx 能否对每个 SSL 请求的域进行双重检查并确保其匹配server_name

答案1

添加以下虚拟服务器:

server {
  listen 443 ssl;
  server_name _;

  ssl on;
  ssl_certificate /path/to/certificate.crt;
  ssl_certificate_key /path/to/certificate.key;

  return 444;
}

如果没有匹配的主机,Nginx 将使用此主机作为最后的手段并返回错误。

它需要 SSL 证书才能工作,但您可以非常快速地生成一个自签名证书,这样就可以了。这比为另一个域共享有效的现有证书(这无论如何都会引发错误)要好,因为泄漏更少。

答案2

我倾向于认为#2是最正确的答案,但我发现当放置在非ssl虚拟服务器的服务器块之上时,以下内容也能正常工作。

server {
  listen 443;
  server_name .example.com;
  return 444;
}

不要使用“ssl”标志。

相关内容