我有两个域在不同的本地服务器上运行,每个域都有自己的SSL证书。过去,这需要两个公共IP地址。随着SNI(服务器名称指示)的出现,这两个站点可以通过像这样修改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证书吗? 提前感谢您的任何建议。
答案 0 :(得分:0)
由于您很乐意使用SNI,因此您的问题不是在同一IP地址(和端口)上使用两个证书,而是将两个服务器绑定到同一个IP地址和端口时间。
让两个不同的服务器监听相同的IP地址和端口通常是不可能或没用的(取决于操作系统)。 1
也就是说,没有什么可以阻止你运行其他Apache Httpd实例,即使是在同一台机器上,也可以在不同的端口上进行监听。
要使客户端连接仍然使用端口443,您可以让一个主Apache Httpd服务器在该端口上运行和侦听,配置为其他服务器的反向代理,具体取决于到达的VirtualHost。
在这种情况下,该前端仍将处理两个证书(并且您通常只需要反向代理前端与同一主机上的其他服务器之间的纯HTTP连接,尽管您可能希望确保其他主机只能从localhost
)访问。
或者,我已经看过(未尝试过)像sniproxy这样的工具,它们允许您检测SNI扩展中的主机名并将其重定向到其他套接字。这是一个类似的原则,但每个后端服务器都会处理自己的证书。
<子> 1。您可能会发现people mentioning using SO_REUSEADDR
on the socket,但这并没有真正解决问题:如果另一个进程处于LISTEN
状态on Unix(“),它将不允许您绑定另一个进程这个套接字选项告诉内核即使这个端口忙(处于TIME_WAIT状态),也要继续使用它。如果它很忙,但是有另一个状态,你仍然会得到一个已经处于使用中的地址错误。“),它不保证连接将转到正确的套接字on Windows(”例如,如果同一端口上的所有套接字都提供TCP服务,则任何传入的TCP连接请求在端口上无法保证由正确的套接字处理 - 行为是非确定性的“)。
答案 1 :(得分:0)
Bruno建议就像一个魅力!非常容易安装和配置。
64位安装的Ubuntu Server 14.04。
配置服务器(升级,ufw等)。
已安装的git。
sudo apt-get install git
已安装的sniproxy依赖项。
sudo apt-get install autotools-dev cdbs debhelper dh-autoreconf dpkg-dev gettext libev-dev libpcre3-dev libudns-dev pkg-config
将sniproxy 0.4.0 git文件下载到所需的文件夹。
内置Debian软件包。
./ autogen.sh&amp;&amp;的dpkg-buildpackage
已安装的软件包。
sudo dpkg -i ../ sniproxy __。deb
已编辑/etc/sniproxy.conf" http_hosts&#34;和&#34; https_hosts&#34;表将域指向所需的本地IP地址和端口。
开始使用sniproxy。
用法:sniproxy [-c] [-f] [-n] [-V]
-c配置文件,默认为/etc/sniproxy.conf
-f在前台运行,不要丢弃权限
-n指定文件描述符限制
-V打印SNIProxy的版本并退出
可以在sniproxy GitHub上找到更多说明。