我陷入了配置 nginx 以支持 SSL 和 SNI 的困境。
为了简化我的情况,假设我有两个域,foo.com
和bar.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 证书才能工作,但你可以生成一个自签名的(该证书无需有效)。