多个虚拟主机的一个 IP 地址和通配符证书(Windows、Apache 2.4.2、OpenSSL 1.0.2e)

多个虚拟主机的一个 IP 地址和通配符证书(Windows、Apache 2.4.2、OpenSSL 1.0.2e)

我搜索了又搜索,但找不到解决我的问题的方法,所以如果这听起来很熟悉,我很抱歉,但我很茫然。

我有:

  • Windows 环境
  • Apache 2.4.2
  • OpenSSL 1.0.2e
  • 一个 IP 地址(开发箱:127.0.0.1)
  • 多个虚拟主机(www.site.co.uk、sub.site.co.uk 等)
  • 来自 Comodo 的真正域名验证通配符证书

我需要对我的所有虚拟主机使用通配符证书。

我已经使用 openssl 测试了站点/证书并且验证成功。

当使用端口 80 上的标准 http 时,所有站点均可正常运行。

当我启用 httpd-ssl.conf 时,我开始遇到麻烦。

我已看到并尝试了几个 http-ssl.conf 配置示例,但都导致间歇性连接失败,例如 Firefox:“安全连接失败“,IE11:”该页面无法显示“。然而,如果我刷新页面(在每个浏览器中),页面就会显示,并且我可以看到证书是有效的。

据我所知,它指出了 http-ssl.conf 的配置不正确,但我尝试过 Mozilla SSL 配置生成器(https://mozilla.github.io/server-side-tls/ssl-config-generator/), 很多 stackoverflow 答案,但仍然没有结果。

这是我当前的 httpd-ssl.conf 文件:

Listen  443 https

SSLStrictSNIVHostCheck off

SSLPassPhraseDialog builtin
SSLSessionCache     "shmcb:C:/Apache2.4/logs/ssl_scache(512000)"
SSLSessionCacheTimeout  300
SSLProtocol         All -SSLv2 -SSLv3 
SSLCipherSuite      ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS

<VirtualHost 127.0.0.1:443>
    ServerName  www.site.co.uk
    ServerAlias www.site.co.uk
    DocumentRoot    C:\WebServer\Apache2.4\htdocs\www.site.co.uk

    SSLEngine On
    SSLCertificateFile "C:\WebServer\Apache2.4\conf\extra\ssl\site_wildcard.crt"
    SSLCertificateKeyFile "C:\WebServer\Apache2.4\conf\extra\ssl\site_wildcard.key"
    SSLCertificateChainFile "C:\WebServer\Apache2.4\conf\extra\ssl\site_wildcard.ca-bundle"
    SSLCACertificateFile "C:\WebServer\Apache2.4\conf\extra\ssl\addtrustexternalcaroot.crt"
</VirtualHost>

<VirtualHost 127.0.0.1:443>
    ServerName  sub.site.co.uk
    ServerAlias sub.site.co.uk
    DocumentRoot    C:\WebServer\Apache2.4\htdocs\sub.site.co.uk
</VirtualHost>

答案1

经过大量测试,我最初的评论并没有解决问题。

证书配置正确。

在 ssllabs.com 等网站上运行测试时,即使没有发生配置更改,协议和握手结果也会随机不同。

使用 OpenSSL 进行测试/验证,偶尔会产生正确的结果,但大多数时候的结果是:

SSL 握手失败

事实证明,罪魁祸首是我的 httpd.conf 文件中存在以下内容:

AcceptFilter https none

将其注释掉后,问题解决了:

#AcceptFilter https none

答案2

当我正确解释配置时,您将 V-Host 设置为本地接口。当您想正确提供页面时,您需要将主机设置为可访问的 IP:

<VirtualHost 0.0.0.0:443>
ServerName  www.site.co.uk
ServerAlias www.site.co.uk
...
</VirtualHost>

或者你的服务器 IP(例如 192.168.23.4)

<VirtualHost 192.168.23.4:443>
ServerName  www.site.co.uk
ServerAlias www.site.co.uk
...
</VirtualHost>

也许这可以解决你的问题。

更新:我的配置如下(Linux 系统)

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerAdmin     [email protected]
        ServerName      www.foo.bar.com
        ServerAlias     foo.bar.com
        DocumentRoot    /var/www/foo
        SSLEngine on
        SSLProtocol TLSv1
        SSLHonorCipherOrder On
        SSLCipherSuite RC4-SHA:HIGH:!ADH

        SSLCertificateChainFile         /etc/apache2/ssl/2015/intermediate.crt
        SSLCertificateFile              /etc/apache2/ssl/2015/public.crt
        SSLCertificateKeyFile           /etc/apache2/ssl/private.open.key
</VirtualHost>
<VirtualHost *:443>
        ServerAdmin [email protected]
        ServerName      www.bar.com
        ServerAlias     bar.com
        DocumentRoot /var/www/bar

        SSLEngine on
        SSLProtocol TLSv1
        SSLHonorCipherOrder On
        SSLCipherSuite RC4-SHA:HIGH:!ADH

        SSLCertificateChainFile         /etc/apache2/ssl/2015/intermediate.crt
        SSLCertificateFile              /etc/apache2/ssl/2015/public.crt
        SSLCertificateKeyFile           /etc/apache2/ssl/private.open.key

...
</VirtualHost>
</IfModule>

相关内容