如何在SaaS HTTPS后端服务器中使用Varnish?

5
我希望配置Varnish以使用HTTPS服务作为后端服务。关键在于与后端服务的连接中的SSL部分!我对这些HTTPS后端服务的控制有限(将它们视为托管在云中的SaaS服务)。
设置如下:User-Agent -> AWS ELB作为SSL终止器 -> AWS中的Varnish ->云中的HTTPS SaaS服务
原因如下: - 我想使用Varnish ESI来使用自己的自定义页面标题和页脚装饰SaaS服务UI。 - 通过让所有请求经过Varnish,我可以获得有关SaaS服务的其他分析数据,否则我将无法获得 - 我可以使用Varnish重新编写SaaS服务的URL,有效地隐藏SaaS服务URL,使最终用户看不到
我能够使用AWS ELB作为面向用户代理的SSL终止器,但是我该如何让Varnish作为源服务器访问HTTPS SaaS服务?
背景: 我在一个Web门户上工作,我们将向客户展示多种不同的服务(所有服务都有自己的现有UI,即它们没有无头RESP API!)。将所有这些服务汇集在一起的主要内容是共同的页面标题和页脚(页面标题显示顶级导航和登录/用户名注销)。
我们拥有的服务类型如下,所有服务都有自己的UI层,我们不想复制: - 白标的第三方SaaS服务(例如Zendesk或Salesforce),托管在云中 - 在AWS中托管的In-house开发的JavaEE / Spring服务 - 其他团队在我们公司开发的服务,但它们托管在我们自己的数据中心中
为每个服务添加ESI包含项很好,但我不想多次复制重新实现页面标题/页脚的工作。

我刚看到了这篇文章:https://komelin.com/articles/https-varnish - zx1986
3个回答

11

我最近遇到了一个类似的需求,需要通过https访问所需的后端。

当然,可能会有很多反对意见,认为这种方法是错误的……但在这种情况下,我受到限制,因为我需要将数据加密到后端,而这个后端与我的地理位置相距甚远,并且由于各种系统的所有权和控制问题,VPN是不可能的。

以下是一个解决方法,经过我的有限测试,似乎有潜力解决这个问题,使用stunnel4

配置文件中的示例行:

client  = yes
[mysslconnect]
accept  = 8888
connect = dest.in.ation.host.or.ip:443

现在,stunnel4正在本地(varnish)机器上监听端口8888,每当有传入连接时,它会在远程系统的443端口上建立SSL连接。

通过与本地服务器上的127.0.0.1端口8888建立连接,我可以与目标后端服务器进行明文HTTP通信,并且这是通过stunnel4实际管理的SSL连接进行的...因此,将varnish配置为使用127.0.0.1:8888作为后端可以做到我想要的,因为varnish认为自己正在与普通的http服务器通信,不知道stunnel4正在为其代劳。

我无法保证其可扩展性或可靠性,因为我刚刚使它工作,但到目前为止,它似乎是解决varnish中限制问题的一个可行解决方法。


这种方法的可靠性或可扩展性有任何更新吗? - chmac
@chmac 自从我设置它以来,这个设置中的stunnel4方面一直无缝运行...尽管在我发布这篇文章后不久,我将负载均衡器本身从varnish切换到haproxy--在版本1.4中,它与varnish具有完全相同的后端SSL限制,因此我仍然以同样的方式使用stunnel4。我没有遇到任何varnish问题或任何强制性的原因要切换到haproxy--实际上当时我正在评估两者,而这个应用程序不需要缓存,所以我选择了感觉最轻量级的选项。 - Michael - sqlbot
太棒了,感谢更新,非常感激。我遇到了一些SNI问题,但我会解决的... :-) - chmac

7

在Varnish中访问HTTPS后端不受支持。Varnish与后端使用HTTP进行通信。

如果您想访问HTTPS后端内容,则必须通过另一个守护程序/代理将其代理,该守护程序/代理添加/剥离HTTPS。有很多选择,其中之一是stunnel,经过尝试和测试。

根据您所描述的(重写内容),我认为您使用的工具可能不太适合。Varnish可能不是此问题的最佳工具,您考虑过使用mod_rewrite/mod_substitude将所有内容粘合在一起吗?


使用SSL终止器删除TLS,然后再使用stunnel重新添加它?如果我错了,请纠正我,但这对我来说似乎不合逻辑,或者应该说是过度杀伤?我的意思是,您想要使用缓存使应用程序更快,但由于SSL终止器和stunnel以及其他资源而使用大量额外的CPU周期来使其工作。这还会增加额外的网络延迟,我想知道这些配置(SSL终止器和stunnel)可以获得多少性能提升。 - yakya
1
从版本4.0开始,Varnish Cache Plus(商业版)支持HTTPS后端。 https://www.varnish-software.com/plus/ssl-tls-support/ - James Wong

2

这是由Varnish Cache Plus支持的内容, 而它不是免费的

backend default {
    .host = "backend.example.com";
    .port = "443";
    .ssl = 1;               # Turn on SSL support
    .ssl_sni = 1;           # Use SNI extension  (default: 1)
    .ssl_verify_peer = 1;   # Verify the peer's certificate chain (default: 1)
    .ssl_verify_host = 1;   # Verify the host name in the peer's certificate (default: 0)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接