Apache:重写端口 80 和 443 - 多个 SSL 虚拟主机设置

Apache:重写端口 80 和 443 - 多个 SSL 虚拟主机设置

设置:

  • 通过使用具有不同端口号(Apache 监听)的虚拟主机,在单个 IP 上配置多个 SSL 域
  • Windows 2003 上的 Apache 2.2.8(请不要对此发表评论)
  • Windows XP 用户太多,因此 SNI 还不是一个选项

可能存在一些原因表明使用这种方法是错误的,但目前它是有效的。

虚拟主机设置:

# secure domain 1
<VirtualHost IP:443>
  SSL stuff specifying certificate etc.
  ServerName domain1.org
</VirtualHost>

# secure domain 2
<VirtualHost IP:81>
  SSL stuff for domain2.org
  ServerName domain2.org
</VirtualHost>

目标: domain2.org docroot 中的某些文件夹需要安全保护。我使用 .htaccess 文件将 URL 重写为端口 81 上的 https:

RewriteEngine On
RewriteCond %{SERVER_PORT} !^81$
RewriteRule (.*) https://%{HTTP_HOST}:81%{REQUEST_URI} [R]

假设我将.htaccess 放在文件夹中'安全文件夹'.
当访问时,http://domain2.org/secfolder它被成功重写为https://domain2.org:81/secfolder。


问题: 访问时https://domain2.org/secfolder(不使用端口 81),将使用来自第一个 vhost(domain1.org)的证书,并且浏览器会抱怨该站点不安全,因为该证书对 domain2.org 无效。

我认为这RewriteCond %{SERVER_PORT} !^81$也会重写https://domain2.orghttps://domain2.org:81但它没有。在这种情况下,.htaccess 文件似乎根本没有被使用。

目前我还不确定如何应用重写规则https://domain2.org。我尝试在为 domain1.org 创建虚拟主机之前,在端口 443 上为 domain2 创建额外的虚拟主机,但 Apache 似乎因此而受阻。我希望你们中有人知道如何解决这个问题。TIA。


编辑:有一个答案已被删除,但它说:
“如果不先验证证书,您就无法连接到服务器,并且由于证书属于错误的域,因此您无法重定向。”证书不匹配真的是结局吗?此后无法强制重定向/URL 重写吗?

答案1

请记住,当您建立 HTTPS 连接时https://domain2.org(这实际上是与https://domain2.org:443),顺序大致如下

  1. 浏览器打开与端口 443 上的 IP 的连接
  2. Apache 寻找与 IP:443 组合匹配的 VirtualHost
  3. 在本例中,它找到了 domain1.org 的 VirtualHost
  4. Apache 发送与该 VirtualHost 关联的 SSL 证书(即 domain1.org 的证书)
  5. [SSL 协商的其余部分]
  6. 浏览器发送其 HTTP 请求标头,包括 Host: 标头,告诉 Apache 它认为正在与哪个域通信。
  7. 如果适用,HTTP 请求标头的 mod_rewrite 处理将在这里发生。

即当 Apache 决定发送哪个证书时,它尚未收到 mod_rewrite 将用于执行重定向的信息。

为了解决这个问题,您需要一个对两个域名都有效的证书。这可以是通配符证书(如果情况是 domain1.example.com 和 domain2.example.com,请获取证书*.example.com),或者您可以尝试使用主题“domain1.org”,但主题备用名称“domain2.org” 的。

无论哪种情况,您都需要在主 Apache 配置文件中执行重定向 - 如果它位于 domain2.org 的 DocumentRoot 中的 .htaccess 文件中,则使用 domain1.org 的 VirtualHost 的请求将转到不同的 DocumentRoot 目录,并且永远不会看到该文件。

答案2

您是否有某种通配符证书,或者您是否尝试在同一个 IP 上托管具有不同 SSL 证书的不同域?

如果它不是通配符,您将无法执行此操作,因为每个 IP 地址只能使用一个 SSL 证书,无论其在哪个端口上......

相关内容