为什么 httpd 在 SSL 模式下处理错误主机名的请求?

为什么 httpd 在 SSL 模式下处理错误主机名的请求?

我的网站有一个启用 SSL 的虚拟主机,网址为example.com:10443

Listen 10443
<VirtualHost _default_:10443>
  ServerName example.com:10443
  ServerAdmin [email protected]
  ErrorLog "/var/log/httpd/error_log"
  TransferLog "/var/log/httpd/access_log"
  SSLEngine on
  SSLProtocol all -SSLv2
  SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
  SSLCertificateFile "/etc/ssl/private/example.com.crt"
  SSLCertificateKeyFile "/etc/ssl/private/example.com.key"
  SSLCertificateChainFile "/etc/ssl/private/sub.class1.server.ca.pem"
  SSLCACertificateFile "/etc/ssl/private/StartCom.pem"
</VirtualHost>

浏览至https://example.com:10443/可以正常工作。但是,浏览到https://subdomain.example.com:10443/(设置了 DNS) 显示相同的页面(在 SSL 证书警告之后)。我原本希望该指令ServerName example.com:10443会拒绝所有与其他服务器名称的连接尝试。

我如何告诉虚拟主机不要为除顶级 URL 之外的 URL 提供请求?

答案1

您尚未启用NameVirtualHost,因此_default_会将任何与您的服务器的连接发送到配置。请尝试这样做。我添加了空格以提高可读性

NameVirtualHost *:10443
Listen 10443

<VirtualHost *:10443>
  ServerName example.com:10443
  ServerAlias example.com:10443
  ServerAdmin [email protected]

  ErrorLog "/var/log/httpd/error_log"
  TransferLog "/var/log/httpd/access_log"

  SSLEngine on
  SSLProtocol all -SSLv2
  SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
  SSLCertificateFile "/etc/ssl/private/example.com.crt"
  SSLCertificateKeyFile "/etc/ssl/private/example.com.key"
  SSLCertificateChainFile "/etc/ssl/private/sub.class1.server.ca.pem"
  SSLCACertificateFile "/etc/ssl/private/StartCom.pem"

</VirtualHost>

答案2

您似乎没有使用该NameVirtualHost选项,因此 Apache 不会费心检查客户端发送的请求中的服务器主机名。请求将被定向到第一VirtualHost部分,其中 IP:port 匹配,仅此而已。无论您使用什么主机名,都没关系,您将获得完全相同的网站。这称为基于 IP 的虚拟主机匹配。

查看http://httpd.apache.org/docs/2.2/vhosts/details.html了解虚拟主机匹配的完整语义,包括使用的结果NameVirtualHost

答案3

当只有连接级别详细信息可用时,Apache 总是在第一次传递中找到最佳的 ip:port,然后在第二次传递中从剩余的内容中查看主机名(如果在 2.2 中,则必须存在 NameVirtualHost 指令才能允许第二步)

默认与 * 相同。如果某个端口只有一个虚拟主机,则无论是否存在基于名称的 vhost 匹配,都会使用该虚拟主机。

如果您想要一个 * 或特定 IP 的捕获器,请将其创建为一组匹配的 ip:port 组合中的第一个虚拟主机。您可以从那里拒绝任何内容。

相关内容