如何在 SSL 虚拟主机上禁用 catch-all

如何在 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://示例.com一切都很好,但是出于未知的原因,如果我转到指向同一服务器的任何其他域,例如https://anydomain.com然后上面的 vhost 就会响应。显然浏览器说证书与域名不匹配,但忽略它之后我可以从https://示例.com在下面https://anydomain.com,即使在http://anydomain.com我有一个完全不同的网站。

我确实知道能够使用httpshttp://anydomain.com我需要使用另一个 IP 地址设置另一个证书 - 但这不是我的问题。

我想实现以下选项之一:

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

我该如何实现这一点?提前谢谢您。

答案1

如果您为端口仅定义一个 vhost,则 apache 会将其视为默认 vhost,并为连接到它的任何客户端提供服务。

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

所以看起来应该是这样的:

<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 的客户端(如今这类客户端很少),那么您可以在同一个 IP 上拥有任意数量的具有不同 TLS 证书的 https 网站。虚拟 SSL 托管的限制是由于非 SNI 客户端在提供证书之前不会向 SSL 层通告他们希望访问哪个虚拟主机。

相关内容