如何禁用ssl虚拟主机上的catch-all

我的虚拟主机如下所示:

<VirtualHost example.com:443> SSLEngine on SSLCertificateFile /etc/apache2/ssl-keys/example/example.crt SSLCertificateKeyFile /etc/apache2/ssl-keys/example/example.key SSLCACertificateFile /etc/apache2/ssl-keys/example/COMODO_EV_SSL.ca-bundle.crt SSLProtocol -ALL -SSLv3 +TLSv1 SSLCipherSuite ALL:!aNULL:!ADH:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown BrowserMatch ".*MSIE.*" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 CustomLog logs/ssl_request_log \ "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" DocumentRoot /home/example/www/current/web ServerName example.com ServerAlias www.example.com <IfModule php5_module> php_value newrelic.appname "Example" </IfModule> </VirtualHost> 

如果我去https :// example.com,一切都很好,但是对于我来说,如果我去任何指向同一个服务器的域名(如https :// anydomain.com),那么上面的虚拟主机正在响应。 很显然,浏览器认为证书与域不匹配,但忽略后,我可以在https :// anydomain.com下的https :// example.com看到该网站,甚至在http :// anydomain.com下面有完全不同的网站。

我知道,要在http :// anydomain.com上使用https ,我需要使用另一个IP地址设置另一个证书 – 这不是我的问题。

我想实现以下选项之一:

  • https :// anydomain.com应该指向http :// anydomain.com
  • https :// anydomain.com将返回404错误

我如何做到这一点? 先谢谢你。

如果你只为你的端口定义一个虚拟主机,它将被apache视为一个默认虚拟主机,并提供给任何连接到它的客户端。

因此,您需要添加另一个虚拟主机,并将其指定为默认虚拟主机,并将其设置为404客户端。 您应该使用与example.com相同的证书,因为即使是访问https://example.com的客户端,如果他们不使用SNI ,它也将被使用。

所以应该看起来像这样:

 <VirtualHost _default_:443> SSLEngine on SSLCertificateFile /etc/apache2/ssl-keys/example/example.crt SSLCertificateKeyFile /etc/apache2/ssl-keys/example/example.key SSLCACertificateFile /etc/apache2/ssl-keys/example/COMODO_EV_SSL.ca-bundle.crt SSLProtocol -ALL -SSLv3 +TLSv1 SSLCipherSuite ALL:!aNULL:!ADH:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM Redirect 404 / </VirtualHost> 

请注意,如果你不关心没有SNI的客户(他们往往是现在很less的客户),你可以在同一个ip上拥有任意数量的具有不同TLS证书的https网站。 对虚拟SSL托pipe的限制是由于非SNI客户端不向SSL层宣告他们希望访问哪个虚拟主机之前必须提供证书。