具有多个域的一台 Apache 服务器上的 SSL 和 ServerAlias

具有多个域的一台 Apache 服务器上的 SSL 和 ServerAlias

我有一个虚拟服务器,我想将两个域指向它,两个域都指向不同的站点。

例如,example1.com/var/www/example1example2.com/var/www/example2

我可以使用 VirtualHosts 很好地做到这一点:

<VirtualHost *:80>
    ServerName example1.com
    DocumentRoot "/var/www/example1"
</VirtualHost>

<VirtualHost *:80>
    ServerName example2.com
    DocumentRoot "/var/www/example2"
</VirtualHost>

我的第一个问题与前导有关www。为了支持www,我刚刚添加了一个ServerAlias

<VirtualHost *:80>
    ServerName example1.com
    ServerAlias www.example1.com
    DocumentRoot "/var/www/example1"
</VirtualHost>

这是最好的方法吗?

我的第二个问题涉及 SSL。我也希望example2.com通过 SSL 进行访问:https://example2.com。我已经颁发了证书等,但我如何在我的httpd.conf文件中实现这一点?目前我有一个临时的解决方法。我刚刚将服务器的主程序更改DocumentRoot为指向此/var/www/example2。我了解 SSL 位于不同的端口上,因此它不会被 VirtualHost 定义解释,因此我已将此作为快速解决方法。但是,我想知道最好的方法是什么?

答案1

  1. 是的 - ServerAlias 是实现该目标的标准方法。有时,最好选择 www.myserver.com 作为“最优先”身份,并使用“myserver.com”作为别名,但除非您在某个时候规范化(将链接转换为首选链接)URL,否则这实际上没有什么不同。

    2.

编辑:我似乎误解了 OP 的问题,所以这基本上是不相关的

简短回答 (用于在一台 Apache 服务器上托管多个 SSL 站点)

  • 最简单的解决方案是基于 IP 的虚拟主机...支持所有浏览器 - 向您的 ISP 索取第二个 IP 地址。因此,每个 SSL 证书都有 1 个 IP。请参阅下面的示例配置。

  • 服务器名称指示 - 不是 XP 或旧版 Safari,也不是旧版 Android - 仅适用于 1 个 IP -http://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI

长答案(我确实被这个答案迷住了...;-) 这里是有关 SSL 和名称虚拟主机的快速入门信息....

基于名称的虚拟主机,是一种根据客户端(即 Web 浏览器等)提供的“主机”标头在网站之间共享 Web 服务器的策略。

这是 HTTP 1.1 扩展,要使用它,apache 会读取请求的内容并解析标头,即它看起来像这样;

GET /index.htm HTTP/1.1
Accept: image/png,image/*;q=0.8,*/*;q=0.5
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:8.0) Gecko/20100101 Firefox/8.0
Host: www.google.co.uk            <--  apache checks this value 

然而TLS 握手用于 SSL 连接,服务器在发送主机头之前使用 SSL 证书中的“通用名称”字段来识别自己。

因此(使用传统的...SSL v1、旧浏览器等、Windows XP)每个 IP 地址只能有一个 SSL 身份,因为服务器做的第一件事就是将自己标识为 www.amazon.com,之后就无法更改...

基本上,正常情况下的区别是这样的http://myserver.com要求

client: hello server   
server: hello client   
client: please give me web XXX   
server: here is websiteXXX    

但对于 https:// 请求来说,它更像这样;

client: hello server   
server: I am website XXX   
client: ok, go ahead and give me website XXX   
server: here is websiteXXX   

因此,基本上,对于“支持所有浏览器”,包括老旧浏览器的解决方案,您需要向您的 ISP 索取另一个公共 IP 地址然后将第二个虚拟主机绑定到第二个 IP 而不是第一个......

但是也有一些替代方案,允许在单个 IP 地址上使用多个 SSL 身份,并且可在大多数现代浏览器上使用,例如 SNI 或通配符证书。

  • 通配符证书,不适用于这种特殊情况,因为服务器名称是域级别的,例如 badger.com 和 monkey.com,而不是 badger.server.com 和 monkey.server.com

然而服务器名称指示在握手过程中,告诉服务器您想要哪个主机,服务器可以提供正确的证书。看起来服务器将恢复使用默认证书,因此,当您拥有一个“主要” SSL 站点和一个不太重要的站点(您可以接受一些用户请求的丢失)时,这可能是一个很好的策略。

基本上,添加 SSL 虚拟主机的指令是类似的,只是您添加的是普通的虚拟主机,而不是 NameVirtualHosts。

#if not done elsewhere in httpd.conf incldue these
Listen 443
LoadModule ssl_module   modules/mod_ssl.so

#this does work for wildcard SSL certs like *.myserver.com (and SNI???)
NameVirtualHost *:443

<VirtualHost 1.1.1.1:443>
  SSLEngine On
  ServerName address1.com
  DocumentRoot /var/www/adderss2
  SSLCertificateFile /etc/httpd/conf/domaina_ssl/zimbra.zmb.moc.crt
</VirtualHost>

<VirtualHost 1.1.1.2:443>
  SSLEngine on
  ServerName address2.com
  DocumentRoot /var/www/adderss2
  SSLCertificateFile /etc/apache2/ssl/apache.pem
</VirtualHost>

答案2

您的 www ServerAlias 完全正常;不用担心。如果您想要更高级一些,可以设置 RewriteRule 以将流量从 www.example.com 引导到 example.com,反之亦然。至于 SSL 支持,请为您的 :80 和 :443 虚拟主机使用单独的 VirtualHost 定义。

相关内容