在一个 IP 和一个端口上为多个域名提供服务

在一个 IP 和一个端口上为多个域名提供服务

我想在我的 CentOS 服务器上提供多个域。我在 http 上运行服务器。现在我想使用另一个证书在 https 上运行这些服务器。

我这样写了 ssl.conf。

Listen 443
<VirtualHost *:443>
  SSLEngine on
  SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
  SSLCertificateFile /etc/httpd/ssl/apache.crt
  SSLCertificateKeyFile /etc/httpd/ssl/apache.key
  SSLCertificateChainFile /etc/httpd/ssl/ca.crt
  ServerName www.example.com:443
  DocumentRoot "/var/www/html"
</VirtualHost>
<VirtualHost *:443>
  SSLEngine on
  SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
  SSLCertificateFile /etc/httpd/ssl/two.crt
  SSLCertificateKeyFile /etc/httpd/ssl/two.key
  SSLCertificateChainFile /etc/httpd/ssl/ca.crt
  ServerName two.example.com:443
  DocumentRoot /var/www/html/two
</VirtualHost>

但它不起作用。我该怎么办?

谢谢。

答案1

不幸的是,您不能。原因是客户端浏览器请求中的 URL 在到达您的服务器时与请求的其余部分一起加密。因此,如果不知道它是针对哪个主机(以及哪个证书),就无法解密它。

过去,我曾用两种不同的方法解决这个问题。第一种方法需要防火墙访问和多个公共 IP 地址,第二种方法需要更高级的 SSL 证书。

  1. 我运行了多个 SSL 网站,方法是在不同的端口上运行它们,然后将来自防火墙上不同 IP 地址的 SSL 流量引导到服务器上的不同端口。因此 - 一台服务器,一个内部 IP 地址,但每个站点都有一个单独的外部 IP 地址,并在防火墙上使用端口转发来修改传入端口号,从而引导流量。

  2. 另一种选择是拥有一个适用于多个域名的单一证书。这被称为 SAN(安全备用名称)证书。例如,Geotrust 就有一个证书,您可以添加最多 25 个域名。这是更简单的方法,因为当请求到达时,每个站点都使用相同的证书,因此可以解密并按照您描述的方式处理请求。这些证书比基本的 SSL 证书贵得多,但公平地说,它们要好一点。

答案2

您正在尝试使用基于名称的虚拟主机使用 SSL/TLS。默认情况下,这是不可能的,因为 SSL/TLS 和 Http 的工作方式(查看这里)。

也许你想尝试使用 SNI 的虚拟主机的 SSL但对于现有的证书来说这也会很困难。

相关内容