Apache 提供来自不同域的证书

Apache 提供来自不同域的证书

我有一台带有 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 证书的技术。

相关内容