ls0f / my-issues

0 stars 0 forks source link

普通HTTP代理怎么代理HTTPS #9

Open ls0f opened 8 years ago

ls0f commented 8 years ago

代理就是一个中间人的角色。而HTTPS又是中间人的克星。因为在ssl握手阶段,协商好的数据加密秘钥是通过服务器的公钥加密,只有服务器的私钥能够解密,从而代理中间人就不能解包两端的数据了。

ls0f commented 8 years ago

HTTPS也可以中间人劫持,只不过会被浏览器提示证书不被信任罢了。我们也可以自己充当CA,将CA根证书添加到系统受信任根证书列表中,然后给其他网站颁发证书和私钥,代理中间人使用自己颁发的证书来进行转发加密。

ls0f commented 8 years ago

Fiddle和GoAgent都是这种做法。TCP 隧道不涉及到这个问题,因为隧道是对数据进行盲转发,不需要解包数据。

ls0f commented 8 years ago

CDN也是一个代理中间人的角色。

ls0f commented 8 years ago

但CDN如何代理HTTPS服务呢?不可能让每个人都导入CDN自己颁发的证书到受任何证书列表中去。

最简单的办法是网站提供商将域名证书的私钥交给CDN保存,但这涉及到一个安全和信任问题。

ls0f commented 8 years ago

cloudflare 推出了keyless服务,也就是不需要提供私钥也能为https提供CDN服务。

ls0f commented 8 years ago

具体做法是:ssl握手阶段还是由浏览器和CDN来完成,浏览器最后会把会话加密秘钥用证书的公钥加密传给CDN,CDN把加密的会话秘钥交给网站提供商去解密然后得到会话秘钥,后面的一系列服务就由CDN来处理。