Nginx/SNI:如果同一 IP 上托管的特定域没有可用的证书,则返回 444

Nginx/SNI:如果同一 IP 上托管的特定域没有可用的证书,则返回 444

我陷入了配置 nginx 以支持 SSL 和 SNI 的困境。

为了简化我的情况,假设我有两个域,foo.combar.com。我只有一个 IP,两个域都映射到这个 IP。我希望foo.com通过 可用https,但不是bar.com。后者应该在端口 443 上不可用。我知道这在纯 SSL 中是不可能的,但有人告诉我,我现在可以安全地依赖 SNI。所以我假设我的浏览器(Chrome)会将它想要访问的网站的域名与 SSL 初始化请求一起发送。

如果我访问bar.com,nginx 将使用为 颁发的已配置证书bar.com,完美。如果我访问https://foo.com,但listen *:443实际上不存在任何指令,nginx 也会使用 的证书进行回复bar.com,因此 Chrome 会抛出证书异常。我尝试配置 SSL 侦听指令,foo.com并在 vhost 中添加以下代码,但没有成功:

if ($server_port = 443) {
  return 444;
}

它现在发送了错误的证书并且之后才拒绝连接。

如果 nginx 无法找到所请求域的适当证书,是否可以让 nginx 在将任何 SSL 回复发送回浏览器之前关闭连接?

答案1

当 Nginx 无法找到给定域的虚拟主机时,它将使用第一个合适的虚拟主机(通过端口和 SSL 存在)。您需要添加一个server {}条目所有其他server {}条目,以便 Nginx 将其用于https://foo.com其他具有未知域的 HTTPS 请求:

server {
    listen 443 ssl;

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

    return 404;
    # or return 444; to just drop such connections
    # or return 302 http://$host$request_uri; to redirect them to HTTP
}

它需要 SSL 证书才能工作,但你可以生成一个自签名的(该证书无需有效)。

相关内容