我有两个域在不同的本地服务器上运行,每个域都有自己的 SSL 证书。在过去,这需要两个公共(public) 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 证书吗?
预先感谢您提出任何建议。
最佳答案
既然您乐于使用 SNI,您的问题就不是在同一个 IP 地址(和端口)上使用两个证书,而是让两个服务器同时绑定(bind)到同一个 IP 地址和端口时间。
让两个不同的服务器监听相同的 IP 地址和端口通常是不可能或没有用的(取决于操作系统)。1
也就是说,没有什么能阻止您运行其他 Apache Httpd 实例,即使在同一台机器上,监听不同的端口也是如此。
要使客户端连接仍然使用端口 443,您可以让一个主 Apache Httpd 服务器运行并监听该端口,配置为其他服务器的反向代理,具体取决于到达的 VirtualHost。
在这种情况下,该前端仍会处理这两个证书(并且您通常只需要在反向代理前端和同一主机上的其他服务器之间建立纯 HTTP 连接,尽管您可能希望确保其他主机只能从 localhost
访问。
或者,我见过(未尝试过)像 sniproxy 这样的工具它允许您检测 SNI 扩展中的主机名并将其重定向到其他套接字。原理类似,但每个后端服务器会处理自己的证书。
<子>1。你可能会发现 people mentioning using SO_REUSEADDR
on the socket ,但这并没有真正解决问题:如果另一个进程处于 LISTEN
状态,它不允许您绑定(bind)另一个进程 on Unix ("这个套接字选项告诉内核,即使这个端口很忙(处于 TIME_WAIT 状态),继续并重用它。如果它很忙,但处于另一个状态,你仍然会得到一个地址已经在使用错误。"),它不能保证连接会转到正确的套接字 on Windows (“例如,如果同一端口上的所有套接字都提供 TCP 服务,则无法保证通过该端口传入的任何 TCP 连接请求都由正确的套接字处理——行为是不确定的 ").
关于apache - 是否可以在 1 个 IP 地址上运行 2 个具有单独 SSL 证书的服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30107442/