当 HTTPS 站点与请求的 VirtualHost 名称不匹配时,如何阻止 Apache 为 HTTPS 站点提供服务?

当 HTTPS 站点与请求的 VirtualHost 名称不匹配时,如何阻止 Apache 为 HTTPS 站点提供服务?

我使用 Apache2 和命名虚拟主机从一个 IP 地址为两个不同的网站(exampleone.comexampletwo.com)提供服务。一个网站(exampleone.com应该是 HTTP 和 HTTPS,而另一个(example2.com)应该只提供 HTTP 服务。

到目前为止,我已经让它们各自的 HTTP 站点按预期运行,并且我已经让 HTTPS 为其预期运行的站点运行——但是,当我访问时,https://exampletwo.com我收到了https://exampleone.com内容和安全警告。

我如何才能让https://exampletwo.com请求被拒绝?

<VirtualHost 1.2.3.4:80>
    ServerName exampleone.com
    ServerAlias *.exampleone.com
    DocumentRoot /var/www/exampleone.com
    <Directory /var/www/exampleone.com>
            Options MultiViews
            AllowOverride None
            Order allow,deny
            allow from all
    </Directory>
    CustomLog /var/log/apache2/exampleone.log combined
</VirtualHost>

<VirtualHost 1.2.3.4:80>
    ServerName exampletwo.com
    ServerAlias *.exampletwo.com
    DocumentRoot /var/www/exampletwo.com
    <Directory /var/www/exampletwo.com>
            Options MultiViews
            AllowOverride None
            Order allow,deny
            allow from all
    </Directory>
    CustomLog /var/log/apache2/exampletwo.log combined
</VirtualHost>

<IfModule mod_ssl.c>
<VirtualHost 1.2.3.4:443>
    ServerAdmin [email protected]
    ServerName exampleone.com
    ServerAlias *.exampleone.com

    DocumentRoot /var/www/exampleone.com

    <Directory /var/www/exampleone.com>
            Options MultiViews
            AllowOverride None
            Order allow,deny
            allow from all
    </Directory>

    CustomLog /var/log/apache2/exampleone-ssl.log combined

    #   SSL Engine Switch:
    #   Enable/Disable SSL for this virtual host.
    SSLEngine on

    #   A self-signed (snakeoil) certificate can be created by installing
    #   the ssl-cert package. See
    #   /usr/share/doc/apache2.2-common/README.Debian.gz for more info.
    #   If both key and certificate are stored in the same file, only the
    #   SSLCertificateFile directive is needed.
    SSLCertificateFile    /etc/ssl/certs/exampleone.com.crt
    SSLCertificateKeyFile /etc/ssl/private/exampleone.com.key
</VirtualHost>
</IfModule>

答案1

编辑:正如其他人指出的那样,看看信噪比

正如解释的那样这里,通过 https 联系的服务器在发送其证书之前无法猜测客户端想要与哪个域名进行通信。

如果http://exampleone.com由 https 提供服务,则意味着访问者从该服务器获得的第一件事是“嗨,我的证书对名称有效http://exampleone.com“,即使你想要http://exampletwo.com。因此,你不能停用 https http://exampletwo.com,也不能设置重定向或任何不会导致访问者受到警告的操作。

更多解释请点击此处

为了解决您的问题,您需要两个不同的 IP 地址来为您的两个域名提供服务。

答案2

NameVirtualHost *:443您可以启用 SNI。您所要做的就是在语句中包含Listen 443(在 ubuntu apache 配置中,将其添加到 /etc/apache/ports.conf)。然后,您可以配置第二个 SSL 虚拟主机,并为它们都指定ServerName

注意:旧浏览器不支持 SNI。例如,Windows XP 上没有 IE 版本。在这种情况下,user2299bla 提到的每个站点的 IP 地址限制有效。

相关内容