为什么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提供请求?

你还没有启用NameVirtualHost所以_default_会发送任何连接到你的服务器的configuration。 像这样尝试。 为了便于阅读,我添加了空格

 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> 

您似乎没有使用NameVirtualHost选项,因此Apache不会在客户端发送的请求中检查服务器的主机名。 该请求将被引导至IP:端口匹配的第一个VirtualHost部分,就是这样。 无论您使用的主机名称是什么,都无关紧要,您将获得完全相同的网站。 这被称为基于IP的虚拟主机匹配。

请查阅http://httpd.apache.org/docs/2.2/vhosts/details.html了解虚拟主机匹配的完整语义,包括使&#x7528;NameVirtualHost的结果。

你可以试试这个:

 NameVirtualHost *:10443 SSLStrictSNIVHostCheck off <VirtualHost *:10443> # default - no ServerName/ServerAlias DocumentRoot /var/www/default SSLEngine on SSLCertificateFile "/etc/ssl/private/example.com.crt" SSLCertificateKeyFile "/etc/ssl/private/example.com.key" # other relevant configuration </VirtualHost> <VirtualHost *:10443> ServerName subdomain.example.com DocumentRoot /var/www/subdomain.example.com SSLEngine on SSLCertificateFile "/etc/ssl/private/subdomain.example.com.crt" SSLCertificateKeyFile "/etc/ssl/private/subdomain.example.com.key" # other relevant configuration </VirtualHost> 

Apache总是在第一遍中find最好的ip:port,当只有连接级别细节可用时,然后从第二遍中查看主机名(如果在2.2中,必须存在NameVirtualHost指令以允许第二步)

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

如果您想要一个全面的*或特定的IP,请将其创build为一组匹配的ip:port组合中的第一个虚拟主机。 你可以拒绝那里的东西。