我有一台带有 Apache(2.4.25)网络服务器的服务器,用于多个域及其子域。
目前,我使用相同的结构配置了每个 VirtualHost 文件,并通过 certbot 为每个域/子域生成了 SSL 证书。除了一个网站外,我的所有网站都正常运行。
VirtualHost(:80 和 :443 位于单独的文件中)
<VirtualHost domain2.org:80>
ServerName domain2.org
DocumentRoot /var/www/domain2.org
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/.*
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [QSA,L,R=301]
</VirtualHost>
<VirtualHost domain2.org:443>
ServerName domain2.org
DocumentRoot /var/www/domain2.org
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/domain2.org/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/domain2.org/privkey.pem
</VirtualHost>
我使用以下命令创建了证书:
certbot certonly --webroot --webroot-path /var/www/domain2.org -d domain2.org
假设我有以下域:
domain1.org
sub.domain1.org
domain2.org
sub.domain2.org
domain3.org
然后当我想domain2.org
用 Firefox (59.0.3) 访问时,出现证书不匹配的情况。它说服务器发送了证书sub.domain1.org
。
附加信息:sub.domain1.org
是 de 目录中的第一个文件(按字母顺序排列)
有人知道我的配置或服务器出了什么问题吗?
答案1
您的虚拟主机定义应该是 apache 正在监听的端口,而不是与域相关的端口。具体来说,这一点:
<VirtualHost domain2.org:80>
通常,它要么是 IP:PORT,要么是 *:PORT,后者表示您希望此 vhost 绑定到系统上的任何 IP,而不是定义的 IP。
此外,这与您在(基于 debian 的系统上)/etc/apache2/ports.conf 中的监听行有关 - 它们的形式为监听 80、监听 IP:80,您的 VirtualHost 定义应该与之匹配。
Apache 在初始化时可能将 domain2.org 解析为您的 IP 地址,如果您的 DNS 尚未更新,或者 DNS 缓存仍然有效,它将解析为错误的 IP。
要查看 apache 正在监听的 ip/端口,以及它被分配给每个 ServerName 定义的 vhost,同样在基于 debian 的系统上,您可以使用以下命令:
apache2ctl -S
简短形式,您可能希望将 VirtualHost 定义为
<VirtualHost *:80>
或者
<VirtualHost *:443>
我假设您正在运行一个支持 SNI 的“足够新”版本的 OpenSSL,SNI 是允许在一个服务器 IP 地址上使用多个 SSL 证书的技术。