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

Oli*_*Ash 6 ssl virtualhost

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

例如,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>
Run Code Online (Sandbox Code Playgroud)

我的第一个问题是与领先的www. 为了启用对 的支持www,我刚刚添加了一个ServerAlias

<VirtualHost *:80>
    ServerName example1.com
    ServerAlias www.example1.com
    DocumentRoot "/var/www/example1"
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

这是最好的方法吗?

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

Tom*_*Tom 9

  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 
Run Code Online (Sandbox Code Playgroud)

但是,通过SSL 连接中使用的TLS 握手,服务器在发送 Host 标头之前使用 SSL 证书中的“通用名称”字段来标识自己。

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

基本上差异是这样的,在正常的http://myserver.com请求中

client: hello server   
server: hello client   
client: please give me web XXX   
server: here is websiteXXX    
Run Code Online (Sandbox Code Playgroud)

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

client: hello server   
server: I am website XXX   
client: ok, go ahead and give me website XXX   
server: here is websiteXXX   
Run Code Online (Sandbox Code Playgroud)

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

然而,有一些替代方案允许在一个 IP 地址上使用多个 SSL 身份,这些身份适用于大多数现代浏览器,例如 SNI 或通配符证书。

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

但是,使用Server Name Indication,您可以在握手过程中告诉服务器您想要哪个主机,并且服务器可以提供正确的证书。看起来服务器将回退到默认 cert,因此当您拥有“主要”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>
Run Code Online (Sandbox Code Playgroud)