Apache SNI:一个IP地址上使用多个SSL证书

6

今天我尝试配置Apache运行两个具有自己SSL证书的域名。据我所了解,只要我的Apache配置了最新版本的OpenSSL,这个过程就可以通过SNI实现。我验证过它已经配置好了:

[notice] Apache/2.2.22 (Ubuntu) PHP/5.3.10-1ubuntu3.7 with Suhosin-Patch mod_ssl/2.2.22 OpenSSL/1.0.1 configured -- resuming normal operations

我以为我已经成功设置了第二个域名和证书,但当我在Chrome浏览器中尝试访问第二个域名时,出现了以下错误:

You attempted to reach example2.com, but instead you actually reached a server identifying itself as example1.com.

这篇文章似乎与我的问题最接近:

在apache上托管多个SSL证书

但从我所知道的来看,我的服务器已经正确配置了(显然不是这样!)
例如,在conf文件example2.com中,我有以下指令:
ServerName  example2.com
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/example2.com.crt
SSLCertificateKeyFile /etc/apache2/ssl/example2.com.key

在我看来这是正确的。那么为什么当我访问example2时,Apache会提供example1的证书呢?

3个回答

3
原来,域名1的配置是这样的:
<VirtualHost *:443>

我使用Webmin,只有在直接查看指令时才会显示该详细信息。
更改 * 是解决问题的一部分,但也引入了其他问题。我想我会采用基于IP的SSL方案。

我的问题是我太傻了。我在我的虚拟主机中忘记了声明ServerName。/facepalm。如果Apache抱怨配置了无法访问的虚拟主机,那就太好了。但是无论如何。 - James T Snell

3

我将这个添加到ports.conf文件中(Apache/2.2.22)

NameVirtualHost *:443

你可以在这篇文章中阅读详细信息。

2
NameVirtualHosts在Apache/2.4中已不再必要。有关详细信息,请参阅此处的Apache文档:http://httpd.apache.org/docs/2.4/new_features_2_4.html。 - Doug Knudsen

-7

在同一IP地址上无法拥有多个SSL域。

背景

当客户端联系https网站时,所有通信都使用站点的公钥(ssl证书)进行加密。只有与公钥关联的私钥才能解密http请求。基本上这就是https工作原理。因此,在您的虚拟主机中,您为每个ssl网站定义证书和密钥。

SSLCertificateFile /etc/apache2/ssl/example2.com.crt
SSLCertificateKeyFile /etc/apache2/ssl/example2.com.key

基于VirtualHost名称和SSL

当您使用基于VirtualHost名称时,当Apache接收到客户端请求时,服务器会读取请求并查看所请求的域名。当识别出域名时,Apache会读取虚拟主机指令并返回正确的网站。

当Apache接收到SSL请求时,系统无法解密消息,因为Apache需要使用Virtualhost中定义的SSLCertificateKeyFile,但要知道要使用哪个虚拟主机,他需要能够解密消息.... 因为Apache不知道如何处理您的请求,所以系统返回第一个处理的虚拟主机。

这就是为什么您需要使用基于IP的虚拟主机,这就是示例中使用的内容:
在Apache上托管多个SSL证书 您有两个IP地址1.1.1.1和2.2.2.2

NameVirtualHost 1.1.1.1:443
NameVirtualHost 2.2.2.2:443
<VirtualHost 1.1.1.1:443>
  ServerName www.domain1.com
  ...
  ...
</VirtualHost>
<VirtualHost 2.2.2.2:443>
  ServerName www.domain2.com
  ...
  ...
</VirtualHost>

基于虚拟主机名称和SSL通配符证书

如果私钥和公钥(SSL证书)对于所有域名都相同,Apache将能够解密通信。这种情况仅在您为一个域名使用通配符证书时发生。例如,如果您有一个用于*.domain.com的通配符证书,您可以像这样定义基于虚拟主机名称的VirtualHost:

NameVirtualHost 1.1.1.1:443

<VirtualHost 1.1.1.1:443>
   ServerName  foo.domain.com
   SSLEngine on
   SSLCertificateFile /etc/apache2/ssl/wildcard.domain.com.crt
   SSLCertificateKeyFile /etc/apache2/ssl/wildcard.domain.com.key
   ... 
   ...
</VirtualHost>

<VirtualHost 1.1.1.1:443>
   ServerName  bar.domain.com
   SSLEngine on
   SSLCertificateFile /etc/apache2/ssl/wildcard.domain.com.crt
   SSLCertificateKeyFile /etc/apache2/ssl/wildcard.domain.com.key
   ... 
   ...
</VirtualHost>

这个配置可以工作,因为无论域是什么,Apache都使用相同的私钥解密通信,所以系统将能够选择良好的VirtualHost设置。

祝您拥有愉快的一天。


5
使用相同的 IP 地址无法拥有多个 SSL 域名,但可以通过使用服务器名称指示(SNI)实现。这也是该问题所涉及的内容。 - Bruno
1
重申前面的发帖人所说,使用SNI是可行的。我的问题是为什么我的特定SNI配置失败了。 - Dan Pouliot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接