关于apache做forward https proxy的问题,求教

2014-01-24 16:44:12 +08:00
 g0t3n
首先说下最近对https proxy的一些了解,其实https proxy并不是一个正确的定义,而在我这个上下文,我把https proxy定义为
client ssl封装 -> proxy server 解密 -> dst host
其核心还是纯 http proxy 请求,但里面的内容在client到proxy中经过ssl封装

最近用squid改改配置的确实现了这个forward proxy,里面内容大概为(我知道有人会叫我贴的;D
acl CONNECT method CONNECT
http_access deny all
https_port 53 cert=best5.crt key=best5.key cafile=best5.crt

本地用 stunnel ,这样的确能跑起来,速度嘛,感觉不咋的,貌似是因为cache没开启的原因?看youtube 也卡。但我能确定不是ssl解密为主要原因(因为下面用 apache 同样做 ssl 加密的时候是很流畅的),注意,这里的squid做出的代理能访问 dst host 为 https 的。(疑问1:这是因为支持 connect么?)

然后我就像用 apache 来实现,这样服务器就不用装 squid 这样的大头了。然后我的配置如下
ProxyRequests ON
AddDefaultCharset Off
ProxyVia Off
SSLEngine on
SSLCertificateFile /etc/httpd/ssl/lidongbest5.crt
SSLCertificateKeyFile /etc/httpd/ssl/lidongbest5.key
SSLProtocol all
SSLCipherSuite HIGH:MEDIUM
是的,client 端仍然用stunnel,然后经过各种测试,我发现youtube,各种被墙的 http 网站均能上了,可是 twitter / facebook 仍然不能上。难道是因为不能用 https 的原因吗?我访问 gmail 仍然是杠杠的。有朋友说 dns 污染什么的,我用 ncat --ssl 却是能访问的
➜ ~ ncat -v --ssl 不告诉你 53
GET http://facebook.com HTTP/1.0


HTTP/1.1 302 forced.302
Date: Fri, 24 Jan 2014 04:56:48 GMT
Location: http://www.facebook.com/unsupportedbrowser
Content-Type: text/html; charset=utf-8
X-FB-Debug: 4fL3rJ6Scx76Vbtlqi/bXz7Z4G2/n5ZGob9jCT2QmS0=
Content-Length: 0
Connection: close
然后我实在是没招了,说了那么多貌似有点凌乱,总结出来就是 apache 配出来的 https 代理不能访问被墙的 https 网站,原因是为甚麽呢?
另外还有一个问题是,chrome中的 switchsharp 中,https代理是什么意思呢?我测试过不能直接连着ssl端口用。。。
5551 次点击
所在节点    Apache
3 条回复
julyclyde
2014-01-25 09:42:05 +08:00
第一段写的那个东西叫 SSL offloader,该服务器和网站之间是HTTP的(注意不是强调未加密,而是强调网站那边会“认为”自己被HTTP而非HTTPS访问)
而你用squid实现的叫支持HTTPS的proxy,也就是支持CONNECT的proxy,客户端的加密数据流经过代理服务器转发到达网站服务器,网站会认为自己被HTTPS访问
完全是两个东西

你后面那一段配置我看不太懂,因为一直比较抵制Apache(Proxy和Rewrite模块界限不够明显,设计得不干净),没好好学习过
但看后面的302回应,应该是facebook不允许“被HTTP访问”所以主动302给你的。你需要的是一个支持CONNECT的proxy
g0t3n
2014-01-25 10:21:11 +08:00
@julyclyde 感谢你的提醒,我忽然想起 http 代理有两个例子就是 GET http://www.baidu.com 和 CONNECT tunnel,如此看来难道是我配置的 apache proxy 并没有用到 mod_proxy_connect 所以才会发生这样的情况?今天我继续折腾折腾。
另外,squid 的 https 代理应该就是您所指的 SSL offloader 的一个特例了,只是里面传输的数据是 http 请求,应该是这样理解把,又学到一个名词了
julyclyde
2014-01-25 16:58:06 +08:00
@g0t3n 不止是代理服务器。客户端软件对于“目标是HTTPS,代理是HTTP”的情况才会尝试CONNECT方法。如果都是HTTP自然是直接GET/POST的。
所谓SSL offloader就是对客户端HTTPS对后面HTTP的代理服务器,负责SSL处理。但需要通过某种方法明确告知后面是HTTPS的;据说一些后面的appserver支持特定的header作为标志

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/98226

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX