![当 SSL 证书不存在时,让 Nginx 失败,而不是跳转到仅可用的证书](https://linux22.com/image/620712/%E5%BD%93%20SSL%20%E8%AF%81%E4%B9%A6%E4%B8%8D%E5%AD%98%E5%9C%A8%E6%97%B6%EF%BC%8C%E8%AE%A9%20Nginx%20%E5%A4%B1%E8%B4%A5%EF%BC%8C%E8%80%8C%E4%B8%8D%E6%98%AF%E8%B7%B3%E8%BD%AC%E5%88%B0%E4%BB%85%E5%8F%AF%E7%94%A8%E7%9A%84%E8%AF%81%E4%B9%A6.png)
我的服务器上有一堆网站,全部通过 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 用户(仍然占互联网用户的很大一部分)无法使用它。