5

我想将 Varnish 配置为使用 HTTPS(!) 服务作为后端服务。这里的关键是与后端服务连接的 SSL 部分!我对这些 HTTPS 后端服务的控制有限(将它们视为托管在云中的 SaaS 服务)。

它是这样的设置:用户代理 -> AWS ELB 作为 SSL 终结器 -> AWS 中的 Varnish -> 云中的 HTTPS SaaS 服务

其原因如下: - 我想使用 Varnish ESI 用我自己的自定义页眉和页脚来装饰 SaaS 服务 UI。- 通过让所有请求都通过 Varnish,我可以获得有关 SaaS 服务的额外分析数据,否则我将无法获得 - 我可以使用 Varnish 重写 SaaS 服务的 URL,从而有效地向最终用户隐藏 SaaS 服务 URL

我可以将 AWS ELB 用作用户代理的 SSL 终结器,但是如何让 Varnish 将 HTTPS SaaS 服务作为源服务器访问?

背景:我在一个门户网站上工作,我们将在其中向我们的客户展示许多不同的服务(所有服务都有自己现有的 UI,即它们没有无头 RESP API!)。将所有这些服务整合在一起的主要内容是一个通用的页眉和页脚(页眉显示顶级导航和登录名/用户名注销)。

我们拥有的服务类型如下,它们都有自己的 UI 层,我们不想复制它们: - 托管在云中的白标 3rd 方 SaaS 服务(例如 Zendesk 或 Salesforce) - 内部开发托管在 AWS 中的 JavaEE/Spring 服务 - 我们公司其他团队开发的服务,但它们托管在我们自己的数据中心

添加 ESI 包含对于这些服务中的每一个都很好,但我不想为每个服务重复多次重新实现页眉/页脚的工作。

4

3 回答 3

9

我最近遇到了类似的要求,需要使用 https 访问所需的后端。

当然,对于为什么这是错误的做法,可能会提出很多反对意见......但在这种情况下,我受到以下事实的限制:我需要将数据加密到后端,很大的地理距离,以及由于各种系统的所有权和控制权而无法使用 VPN 的事实。

这是一种解决方法,从我有限的测试来看,它似乎有可能使用stunnel4解决这个问题。

配置中的示例行:

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

现在,stunnel4 正在我的本地(清漆)机器上侦听端口 8888,并且每次传入连接到达时,它都会建立到远程系统上端口 443 的 ssl 连接。

与本地服务器上的 127.0.0.1 端口 8888 的连接允许我向目标后端服务器发送明文 HTTP,这发生在实际上由 stunnel4 管理的 SSL 连接上......因此将 varnish 配置为使用 127.0.0.1 :8888 因为 varnish 认为它正在与普通的 http 服务器对话,所以后端执行了我的意图,不知道 stunnel4 代表它在做什么。

我不能保证它的可扩展性或可靠性,因为我只是没有让它工作,但到目前为止,它似乎是解决清漆限制的可行解决方法。

于 2013-06-07T16:39:45.340 回答
7

不支持在 Varnish 中访问 HTTPS 后端。Varnish 向后端发送 HTTP。

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

根据您所描述的(重写内容),我会说您非常接近使用错误的锤子。Varnish 可能不是最好的工具,您是否考虑过将东西与 mod_rewrite/mod_substitude 粘合在一起?

于 2013-06-04T08:55:56.890 回答
1

这由不是免费的 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)
}
于 2019-08-14T23:47:41.567 回答