是否可以 运行 2 台服务器在 1 个 IP 地址上使用单独的 SSL 证书?

Is it possible to run 2 servers with seperate SSL certificates on 1 IP address?

我在不同的本地服务器上有两个域 运行ning,每个域都有自己的 SSL 证书。在过去,这需要两个 public IP 地址。随着SNI(Server Name Indication)的出现,这两个站点可以运行在同一台服务器上通过修改Apache.conf像这样-

<NameVirtualHost *:443>

<VirtualHost *:443>
 ServerName www.yoursite.com
 DocumentRoot /var/www/site
 SSLEngine on
 SSLCertificateFile /path/to/www_yoursite_com.crt
 SSLCertificateKeyFile /path/to/www_yoursite_com.key
 SSLCertificateChainFile /path/to/DigiCertCA.crt
</VirtualHost>

<VirtualHost *:443>
 ServerName www.yoursite2.com
 DocumentRoot /var/www/site2
 SSLEngine on
 SSLCertificateFile /path/to/www_yoursite2_com.crt
 SSLCertificateKeyFile /path/to/www_yoursite2_com.key
 SSLCertificateChainFile /path/to/DigiCertCA.crt
</VirtualHost>

出于安全考虑,我更愿意 运行 这些站点位于不同的本地服务器上,以在一台服务器遭到破坏时帮助减轻损失。 这可以通过 Apache.conf 中的本地 IP 地址重定向来完成而不破坏 SSL 证书吗?
预先感谢您的任何建议。

既然您乐于使用 SNI,那么您的问题不在于在同一个 IP 地址(和端口)上使用两个证书,而是让两个服务器绑定到同一个 IP 地址和端口同时。

让两个不同的服务器侦听相同的 IP 地址和端口通常是不可能或没有用的(取决于 OS)。1

也就是说,没有什么能阻止您 运行 其他 Apache Httpd 实例,即使在同一台机器上,侦听不同的端口。

要使客户端连接仍然使用端口 443,您可以有一个主 Apache Httpd 服务器 运行 并侦听该端口,配置为其他服务器的反向代理,具体取决于哪个已达到 VirtualHost。

在这种情况下,该前端仍会处理这两个证书(并且您通常只需要在反向代理前端和同一主机上的其他服务器之间建立纯 HTTP 连接,尽管您可能想要确保其他主机只能从 localhost).

访问

或者,我见过(未尝试过)像 sniproxy 这样的工具,它允许您检测 SNI 扩展中的主机名并将其重定向到其他套接字。原理类似,但每个后端服务器会处理自己的证书。


1.您可能会发现 people mentioning using SO_REUSEADDR on the socket, but that doesn't really solve the problem: it won't allow you to bind another process if another one is in LISTEN state on Unix ("This socket option tells the kernel that even if this port is busy (in the TIME_WAIT state), go ahead and reuse it anyway. If it is busy, but with another state, you will still get an address already in use error."), and it won't guarantee the connection will go to the right socket on Windows (" 例如,如果同一端口上的所有套接字都提供 TCP 服务,则无法保证通过该端口传入的任何 TCP 连接请求都由正确的套接字处理 —行为是不确定的").

sniproxy suggestion from 很有魅力!非常容易安装和配置。

  1. 已安装 Ubuntu 服务器 14.04 64 位。

  2. 已配置的服务器(升级、ufw 等)。

  3. 已安装git。

    sudo apt-get install git

  4. 已安装 sniproxy 依赖项。

    sudo apt-get install autotools-dev cdbs debhelper dh-autoreconf dpkg-dev gettext libev-dev libpcre3-dev libudns-dev pkg-config

  5. 已将 sniproxy 0.4.0 git 文件下载到所需文件夹。

    git clone https://github.com/dlundquist/sniproxy.git

  6. 构建 Debian 软件包。

    ./autogen.sh && dpkg-buildpackage

  7. 安装包。

    sudo dpkg -i ../sniproxy__.deb

  8. 编辑了 /etc/sniproxy.conf "http_hosts" 和 "https_hosts" 表以将域指向所需的本地 IP 地址和端口。

  9. 已启动 sniproxy。

    Usage: sniproxy [-c ] [-f] [-n ] [-V]
    -c configuration file, defaults to /etc/sniproxy.conf
    -f run in foreground, do not drop privileges
    -n specify file descriptor limit
    -V print the version of SNIProxy and exit

可以在 sniproxy GitHub.

中找到更多说明