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

我有一个虚拟的服务器,我想指出两个域名,都指向不同的网站。

例如, 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。 我也想通过SSL访问example2.com 。 我已经颁发了证书等,但我怎么能在我的httpd.conf文件中实现这个? 目前我有一个临时的解决方法。 我刚刚更改了服务器的主DocumentRoot指向这个/var/www/example2 。 我知道SSL在不同的端口上,所以它不会被VirtualHost定义所解释,所以我把它作为一个快速的解决方法。 不过,我想知道做这件事的最好方法是什么?

  1. 是的 – ServerAlias是实现这一目标的标准方法。 有时候,最好selectwww.myserver.com作为“最优先”的身份,并以“myserver.com”作为别名,但除非您在某个时间点将链接转换为首选url,否则确实没有什么不同。

    2。

编辑:似乎我误解OP的问题,所以这是大多无关紧要的

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

  • 最简单的解决scheme是基于IP的虚拟主机…支持所有的浏览器 – 向ISP询问第二个IP地址。 所以你每个SSL证书有1个IP。 看下面的例子configuration。

  • 服务器名称指示 – 不是XP或旧的safari,或旧的android – 仅与1 IP工作 – http://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI

长答案 (和男孩,我得到了这个答案带走了… ;-)这里是一个快速入门的SSL和名称虚拟主机….

基于名称的虚拟主机,是基于客户端呈现的“主机”头(即,networking浏览器等)在网站之间共享networking服务器的策略。

这是一个HTTP 1.1的扩展,为了使用它,apache读取请求的内容并parsing报头,即它看起来像这样;

 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 

但是,在SSL连接中使用TLS握手时 ,服务器会在发送主机头之前使用SSL证书中的“公用名”字段标识自身。

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

基本上差异是这样的,在正常的http://myserver.com请&#x6C42;

 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 

所以基本上,对于“支持所有浏览器”,包括旧的解决scheme, 你需要问你的ISP的另一个公共IP地址 ,然后绑定你的第二个虚拟主机,而不是第一个…

但也有一些替代scheme,它们允许在大多数现代浏览器上使用单个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> 

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