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

我在服务器上有很多网站,都是通过nginx托pipe的。 一个网站有一个证书,其他网站没有。 下面是两个网站的例子,使用(相当准确)的实际configuration表示:

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.comssl.example.com良好。 如果我访问http://nossl.example.com ,这很好,但如果我尝试访问https://nossl.example.com (请注意SSL),我得到有关证书ssl.example.com丑陋警告ssl.example.com

通过它的声音,因为ssl.example.com是唯一监听端口443的站点,所有请求都被发送到它,而不pipe域名。

有什么我可以做,以确保一个Nginx的服务器指令只响应它负责的域?

为永远不应该在SSL上应答的主机使用不同的IP地址,并确保nginx只在端口443上侦听适当的IP地址。

真正隔离ssl站点,sans多主机/通配符ssl证书的唯一方法是添加二级公共ip到您的箱子(必须通过提供者请求)。

那么,你把每个站点/子域通过DNS自己的IP。 这样,一些域名:443将打开,有些会旋转,直到超时(通过使用iptables的DROP)

不幸的是,域(通过Host头)是encryption的有效载荷的一部分。 因此,nginx直到提交证书之后才知道它的域名。 这是SSL的技术限制,而不是nginx。

http://en.wikipedia.org/wiki/Server_Name_Indication可能会有所帮助,但XP上的IE用户(仍然是相当比例的互联网用户)不能使用它。