设置几个带重定向的 SSL 域的最佳方法

设置几个带重定向的 SSL 域的最佳方法

我想知道在单个 IP 上设置 SSL 域的“最佳”和推荐方法是什么,其中有从 :80 到 :443 的重定向。这里没有完全涵盖这一点,因为我需要这些重定向(https://httpd.apache.org/docs/2.4/vhosts/name-based.html

域名在 DNS 中定义,并且所有域名都重定向到同一个 IP:

  • 集合 1:example1.com 和 example1.org(它们共享相同的 documentroot)。
  • 集合 2:example2.com 和 example2.info(它们还共享另一个 documentroot)。

我在将它们设置为单个 IP 地址时遇到了很多麻烦。我的想法是首先定义正常的 :80 虚拟服务器,它们捕获 http:// 协议并重定向到 https://。然后,在 *:443 中定义为基于名称的虚拟主机的整体中进行正确的配置。但是,我希望有一些“默认”虚拟主机,它将在其自己的纯文本文档根目录中有空白页,并且只有当请求针对特定域(例如在 set1 或 set2 中)时,才应该为特定域加载整个虚拟主机。我决定不使用重写,因为建议对这样的任务使用简单的重定向。在我的情况下,使用重定向只对单个域有效。

我的设置如下:

<Virtualhost *:80>
    ServerName example1.com
    Redirect / https://example1.com
</Virtualhost>
<Virtualhost *:80>
    ServerName example1.org
    Redirect / https://example1.org
</Virtualhost>
<VirtualHost *:443>
    ServerName example1.com
    DocumentRoot .......
    .......
</VirtualHost>
<VirtualHost *:443>
    ServerName example1.org
    DocumentRoot .......
    .......
</VirtualHost>
<VirtualHost *:443>
    ServerName example2.com
    DocumentRoot .......
    .......
</VirtualHost>
<VirtualHost *:443>
    ServerName example2.info
    DocumentRoot .......
    .......
</VirtualHost>

这种设置的一个问题是它不起作用。另一个问题是它会重复很多次。我想我需要配置类似这样的内容(psedoconfig):

虚拟配置,例如捕获纯 IP 请求等。

<example1.com 和 .org 的虚拟域> 如果有请求 http,则重定向到 https,并且对于两个域定义相同的设置,定义 documentroot、此域的所有日志和证书等。

<AnotherVirtual 例如 2.com 和 .info> 再次出现在这里 - 如果请求 http,则移动到 https 公共 documentroot、日志等。

我认为重定向方面的专家可以处理这个问题,或者也许有一些我忽略的首选方法。

编辑:好的,现在配置已经测试过了,我确信我知道我拥有什么。但不幸的是它不起作用。

我使用 acme.sh 为每个站点颁发了 SSL 证书,输入内容如下(由于隐私原因域名已更改):

acme.sh --issue -d www.AAA.com -d AAA.com -d www.AAA.info -d AAA.info -w /home/path/aaa/www
cd /home/path/aaa/etc
acme.sh --install-cert -d www.AAA.com -d AAA.com -d www.AAA.info -d AAA.info --cert-file cert.pem --key-file priv.pem --fullchain-file fullchain.pem

这工作得很好,但 apache conf 在 vhost 中仅配置了这个域,而 ssl 部分有一些假的/旧的证书以允许 Apache 启动。使用以下方法测试了证书并在浏览器中加载了页面:http://AAA.com地址已正确重定向至https://AAA.com,这也有效。

然后,我使用类似的程序重新配置了 Apache 以支持 PPP.com 域。当我将 Apache 配置为仅单个域时,这也有效。现在,连接这两个配置不起作用,因为 PPP.com 被识别为具有 AAA.com 的证书,这会触发错误 NET::ERR_CERT_COMMON_NAME_INVALID

所以,我被困住了。这是我的虚拟主机的 apache 配置:https://pastebin.com/hK3g6K3m

包含为 common.cfg 的部分仅包含标准 SSL 选项和目录访问配置、日志配置等。

答案1

我自己还没有尝试过你想要完成的事情,但如果我愿意尝试的话,我会这样做:

  1. 使用永久重定向将所有 HTTP 流量重定向到其 HTTPS 对应项(如您所做的那样)
  2. 在所有“辅助”虚拟主机中使用重写规则来重写要发送到“主”虚拟主机的请求,并在其中接受请求并对其进行响应(这也会保持辅助虚拟主机的 URL 对您网站的访问者可见)
  3. 使用包含来避免重复:将可以在这些虚拟主机之间共享的所有内容(例如缓存,SSL 等指令)放在一个或多个文本文件中,然后将其包含在虚拟主机定义中。

答案2

执行 SSL 时,您应该考虑您的证书。例如,如果您有针对 example1.com 和 example1.org 的单个证书,则只需创建一个VirtualHost具有主证书ServerName和辅助证书(或更多)的ServerAlias证书。如果您为每个域都有独立的证书,则需要将它们分开,VirtualHost因为您不能在同一级别拥有多个证书。

此外,在 2.4 之前的版本中, NameVirtualHost *:443此外强制的事先VirtualHost让 apache 执行 SNI 部分,也就是说,显示您要求的证书而不是默认的证书。

默认 https 将是VirtualHost *:443您定义的第一个 https,因此只需根据需要移动它们即可。

至于 http 部分,如果所有内容都将重定向到其自身的 https 版本(http 不提供任何服务),您可以创建一个VirtualHost *:80包含所有ServerAlias需要的内容的单一版本(这不是必需的,但需要澄清)并使用一个单一版本,RewriteRule例如:

RewriteRule "^/?(.*)"        "https://%{HTTP_HOST}/%1" [L,R,NE]

我没有测试过,但是应该工作。

注意:我没有使用,Redirect因为我不知道它是否允许在替换部分使用环境变量,但您也可以尝试一下。

相关内容