目前我正在使用以下方案来提供静态和动态内容。
我已经使用 X-Forwarded-For 支持补丁编译了 stunnel。
互联网(http)-> haproxy(frontend1)-> Apache Farm
互联网(https)-> stunnel -> haproxy(frontend2)-> Apache Farm
Stunnel 配置为使用来自 xxxx.com 的证书。是否可以添加对 stunnel 的支持以与其他证书一起使用?
cert = /etc/stunnel/group.cert
key = /etc/stunnel/private.key
verify = 0
debug = local0.debug
CAfile = /etc/stunnel/group.cert
chroot = /var/run/stunnel4/chroot
setuid = stunnel4
setgid = stunnel4
failover = prio
xforwardedfor = yes
TIMEOUTclose=0
socket=l:TCP_NODELAY=1
socket=r:TCP_NODELAY=1
[https]
accept = 443
connect = HAPROXYHOST:FRONTEND2PORT
我知道我可以运行另一个绑定到另一个 IP 地址的 stunnel 实例,但如果我们决定托管更多网站,我们没有无限的公共地址,我知道可以配置 Apache 以为每个 VirtualHost 提供不同的证书,可以用这个方案做到这一点吗?或者也许从 stunnel 更改为 Apache mod_proxy 或其他解决方案。
非常感谢。
答案1
在同一地址的同一端口上提供不同的证书依赖于 TLS 服务器名称指示支持,而 stunnel 不支持该支持。
使用 Apache 作为代理确实会为您提供所需的服务器端支持,但是请记住,服务器名称指示的客户端支持(咳咳,Windows XP)尚未普及。
如果您的价格范围之内,可以考虑的另一种选择是提供主题备用名称的证书。
答案2
一般来说,当使用 SSL/TLS 和一个 IP 上的多个站点时,您有两个选择。
第一种是让客户端在初始请求中发送他们感兴趣的主机名称。这就是http://en.wikipedia.org/wiki/服务器名称指示可以实现,但并非所有客户端都支持(请参阅 wikipedia 页面,了解哪些客户端支持哪些客户端不支持)。使用 SNI,主机名在安全协商开始时可用,因此服务器可以选择正确的证书进行响应。
如果您无法使用 SNI,那么您会遇到一个小问题。客户端出现并说“嘿,我想使用 SSL”,但您不知道他们想要什么主机名,因此您无法选择正确的证书。您只知道 IP 地址。因此,要做到这一点,您必须确保您返回的证书对该 IP 上的所有不同虚拟主机都有效。
不过,后者并不像听起来那么糟糕。一种选择是获取通配符证书,例如 *.mysite.com 。只要您为 www.mysite.com 和 images.mysite.com 提供服务(即,两者都在同一个通配符空间内),就没问题。另一种选择是使用主题替代名称在您的证书中。使用此选项,您的一个证书对多个网站有效。这样,当您将一个通用证书发送回客户端时,它将对他们想要的任何主机有效。很多 CA 支持后一种选项,并且它通常是 EVA 证书的唯一选项(您通常无法获得其中的通配符),并且您通常只需在每次想要在该 IP 上添加新虚拟主机时拨打您的 CA,他们会向您收取少量费用并颁发包含额外名称的新证书。