如何防止https://可以从没有证书的域访问?

我有这个设置

Server version: Apache/2.2.22 (Ubuntu) OpenSSL 1.0.1c 10 May 2012 

一个连接了多个域的IP。 example1.com我有一个签名的SSL证书,因此可以通过https://secure.example1.com访问example1.com

example2.com也是如此(用有效的证书签名,可通过https://secure.example2.com访问)

但是, example3.com没有任何SSL证书绑定,并且不能通过https (SSL端口443)访问。 但是, 当用户转到https://example3.com会显示警告。 在Chrome中,它看起来像这样

您试图访问example3.com,但是实际上您已经到达了将自己标识为secure.example1.com的服务器。 这可能是由于服务器configuration错误或更严重的原因造成的。 您的networking上的攻击者可能会试图让您访问example3.com的假(可能有害)版本

如果您忽略警告,则用户将实际显示secure.example1.com的内容

VirtualHost设置看起来像这样

 <VirtualHost *:443> ServerName secure.example1.com DocumentRoot /var/www/blahblah SSLEngine on SSLCertificateFile /blahblah.crt SSLCertificateKeyFile /blahblah.key SSLCertificateChainFile /blahblah.pem </VirtualHost> <VirtualHost *:443> ServerName secure.example2.com DocumentRoot /var/www/blahblah SSLEngine on SSLCertificateFile /blahblah.crt SSLCertificateKeyFile /blahblah.key SSLCertificateChainFile /blahblah.pem </VirtualHost> <VirtualHost *:80> ServerName example3.com DocumentRoot /var/www/blahblah </VirtualHost> 

我怎样才能防止这种行为?

非SSL域不应该使用这个IP。 即使对于多个支持SSL的域名,您依赖于客户端也可以毫无问题地实施SNI,这可能是一个安全的假设。

问题是,在Apache可以将浏览器redirect到HTTP之前,SSL握手必须成功,所以如果您无法为域提供有效的证书,客户端将始终声明SSL错误。

编辑 :如果您只使用一个具有相应SAN的证书(多域证书),则多个SSL域将毫无问题地工作。 但是,非SSL域的问题仍然存在。

正如Koen van der Rijt已经写过的,你应该检查SF是否有类似的问题,并仔细阅读答案。

  apache2ctl -S 

给你虚幻“执行”的顺序,

所以你的example1.com是第一个端口:443定义域然后这个将被使用。

相反,您可以创build一个自签名证书,并通知用户该域目前没有https连接,或者执行rewrite_rule,将stream量从https://domain3.comredirect到http://domain3.com 。 请注意,这将需要一个“无效的”证书,并会通知用户。

如果你不使用SNI,你还需要每个证书至less1个IP。