32

(||any) 代理服务器可以缓存客户端通过 https 请求的内容吗?由于代理服务器看不到查询字符串或 http 标头,我认为他们看不到。

我正在考虑一个桌面应用程序,由他们公司代理背后的许多人运行。这个应用程序可以访问互联网上的服务,我想利用内置的互联网缓存基础设施进行“读取”。如果缓存代理服务器无法缓存 SSL 传递的内容,那么简单地加密响应的内容是一个可行的选择吗?

我正在考虑通过 http 请求我们希望可缓存的所有 GET 请求,并使用非对称加密对正文进行加密,其中每个客户端都有解密密钥。每当我们希望执行不可缓存的 GET 或 POST 操作时,都将通过 SSL 执行。

4

4 回答 4

28

Rory 评论说,如果不是严格正确,代理将不得不使用自签名证书。

可以实现代理为每个被要求处理的新 SSL 主机生成一个新证书,并使用公共根证书对其进行签名。在 OP 的企业环境场景中,通用签名证书可以很容易地作为受信任的 CA 安装在客户端计算机上,并且他们很乐意为被代理的流量接受这些“伪造”的 SSL 证书,因为不会出现主机名不匹配的情况。

事实上,这正是Charles Web Debugging Proxy等软件允许检查 SSL 流量而不会导致浏览器出现安全错误等的方式。

于 2008-08-23T00:19:47.663 回答
24

不,不能直接缓存 https。客户端和服务器之间的整个通信都是加密的。代理位于服务器和客户端之间,为了缓存它,您需要能够读取它,即解密加密。

你可以做一些事情来缓存它。您基本上在您的代理上执行 SSL,拦截发送到客户端的 SSL。基本上,数据在客户端和您的代理之间被加密,被解密、读取和缓存,数据被加密并在服务器上发送。来自服务器的回复同样被解密、读取和加密。我不确定您如何在主要代理软件(如 squid)上执行此操作,但这是可能的。

这种方法的唯一问题是代理必须使用自签名证书将其加密给客户端。客户端将能够判断中间的代理已读取数据,因为证书不会来自原始站点。

于 2008-08-18T14:24:39.477 回答
1

我认为您应该只使用 SSL 并依赖执行缓存的 HTTP 客户端库(例如:Windows 上的 WinInet)。很难想象企业级缓存的好处值得在代理上编写自定义安全加密方案或证书乐趣的痛苦。更糟糕的是,在您提到的加密方案中,在实体主体上执行非对称密码听起来像是对应用程序服务器端的巨大打击;SSL 使用对称密码作为连接的实际有效负载是有原因的。

于 2008-08-23T01:01:24.677 回答
0

在加密 https 响应的组件后面的应用服务器上设置服务器缓存怎么样?如果您有反向代理设置,这将很有用。

我在想这样的事情:

application server <---> Squid or Varnish (cache) <---> Apache (performs SSL encryption)
于 2010-05-18T21:26:12.057 回答