在多个域名设置中,SSL 证书不适用于 www 子域名

在多个域名设置中,SSL 证书不适用于 www 子域名

我有一台运行 CentOS Stream 8 和 Apache 2.4.37 的 LAMP 服务器。在这台服务器上我有三个域名(我们称之为 example.com、example.net 和 example.org)。我为每个域名和www子域名都准备了 SSL 证书。

它们共享相同的代码库(唯一的区别是默认语言),因此它们共享相同的文件夹/var/html/www,并且文件中没有特定的域级别配置/etc/httpd/conf/httpd.conf-ServerNameexample.org:80

我在文件中确实有一个特定的配置/etc/httpd/conf.d/ssl.conf。以下是相关摘录 -<VirtualHost *:443>每个域都有一部分。

NameVirtualHost *:443

<VirtualHost *:443>
DocumentRoot "/var/www/html"
ServerName example.com:443

ErrorLog logs/ssl_example_com_error_log
TransferLog logs/ssl_example_com_access_log
LogLevel warn

SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW

SSLCertificateFile /etc/pki/tls/certs/example_com.crt
SSLCertificateKeyFile /etc/pki/tls/private/example_com.key
SSLCACertificateFile /etc/pki/tls/certs/example_com.ca-bundle
</VirtualHost>

每个域的 SSL 证书都适用于主域,但仅适用于www文件中示例的子域(第一个列出的子域)ssl.conf。因此,如果我尝试访问https://www.example.net或者https://www.example.org,我从浏览器中获得了一个Connection not secure和。Warning: Potential Security Risk Ahead

有效的方法:
https://example.com
https://example.net
https://example.org
https://www.example.com

无效的方法:
https://www.example.net
https://www.example.org

我在日志中找不到任何线索来判断发生了什么。有人知道我应该去哪里找吗?

我已经测试过,任何VirtualHost首先列出的域的部分都是 SSL 适用的部分www

答案1

假设证书正确,您的配置中肯定有一个细节可以解释这种行为。来自 Apache虚拟主机匹配,重点是我的:

如果连接使用 SSL,服务器支持服务器名称指示,并且 SSL 客户端握手包含具有请求的主机名的 TLS 扩展,则下面使用该主机名,就像在非 SSL 连接上使用 Host: 标头一样。否则,第一个匹配 [IP] 地址的基于名称的虚拟主机将用于 SSL 连接。这很重要,因为虚拟主机决定服务器将使用哪个证书进行连接。

你的<VirtualHost *:443>方块丢失了ServerAlias子域名的指令www。因此,第一个VirtualHost被用作基于名称的默认虚拟主机。

此外,ServerName可以不用可选件来使用,[:port]因为不需要通过端口来区分虚拟主机。

还请注意SSLCACertificateFile用于客户端身份验证:

该指令规定一体你可以在这个文件中收集证书颁发机构 (CA) 的证书,客户您处理的证书文件。这些证书文件用于客户端身份验证。此类文件只是按优先顺序连接各种 PEM 编码的证书文件。

文件名example_com.ca-bundle表明你可能将其与(已弃用)混淆了SSLCertificateChainFile;自 2.4.8 起SSLCertificateFile

还可能包括中间 CA 证书,从叶到根排序。

一个例子这可以减少复制粘贴配置以及处理从 HTTP 到 HTTPS 的重定向:

NameVirtualHost *:80
NameVirtualHost *:443

<Macro VHost $domain $tld>
    <VirtualHost *:80>
        ServerName $domain.$tld
        ServerAlias www.$domain.$tld
        Redirect permanent / https://$domain.$tld/
    </VirtualHost>

    <VirtualHost *:443>
        ServerName $domain.$tld
        ServerAlias www.$domain.$tld

        DocumentRoot "/var/www/html"

        ErrorLog logs/ssl_$domain_$tld_error_log
        TransferLog logs/ssl_$domain_$tld_access_log
        LogLevel warn

        SSLEngine on
        SSLProtocol all -SSLv2
        SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW

        SSLCertificateFile /etc/pki/tls/certs/$domain_$tld.crt
        SSLCertificateKeyFile /etc/pki/tls/private/$domain_$tld.key
    </VirtualHost>
</Macro>

Use VHost example com
Use VHost example net
Use VHost example org

相关内容