当 SSL 证书不存在时,让 Nginx 失败,而不是跳转到仅可用的证书

当 SSL 证书不存在时,让 Nginx 失败,而不是跳转到仅可用的证书

我的服务器上有一堆网站,全部通过 nginx 托管。一个网站有证书,其他网站没有。以下是两个网站的示例,使用(相当准确的)真实配置表示:

server {
    listen 80;
    server_name ssl.example.com;
    return 301 https://ssl.example.com$request_uri;
}

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

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

SSL 运行ssl.example.com良好。如果我访问http://nossl.example.com,则运行良好,但如果我尝试访问https://nossl.example.com(请注意 SSL),则会收到有关证书适用于 的警告ssl.example.com

听起来,因为它ssl.example.com是唯一一个在端口 443 上监听的站点,所以所有请求都被发送给它,无论域名是什么。

我可以做些什么来确保 Nginx 服务器指令仅响应它负责的域?

答案1

对永远不会在 SSL 上应答的主机使用不同的 IP 地址,并确保 nginx 仅在端口 443 上监听适当的 IP 地址。

答案2

真正隔离 SSL 站点的唯一方式(不使用多主机/通配符 SSL 证书)是向您的机器添加辅助公共 IP(必须通过提供商请求)。

然后,你通过 dns 将每个站点/子域放在它自己的 ip 上。这样,一些域名:443 将打开,一些将旋转直到超时(通过 iptables 使用 DROP)

答案3

不幸的是,域名(通过Host标头)是加密有效负载的一部分。因此,nginx 在出示证书之前不知道它属于哪个域名。这是 SSL 的技术限制,而不是 nginx 的技术限制。

http://en.wikipedia.org/wiki/服务器名称指示可能会有帮助,但 XP 上的 IE 用户(仍然占互联网用户的很大一部分)无法使用它。

相关内容