我有一台运行 CentOS Stream 8 和 Apache 2.4.37 的 LAMP 服务器。在这台服务器上我有三个域名(我们称之为 example.com、example.net 和 example.org)。我为每个域名和www
子域名都准备了 SSL 证书。
它们共享相同的代码库(唯一的区别是默认语言),因此它们共享相同的文件夹/var/html/www
,并且文件中没有特定的域级别配置/etc/httpd/conf/httpd.conf
-ServerName
example.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