V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
g0t3n
V2EX  ›  Apache

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

  •  
  •   g0t3n · 2014-01-24 16:44:12 +08:00 · 5375 次点击
    这是一个创建于 3745 天前的主题,其中的信息可能已经有所发展或是发生改变。
    首先说下最近对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端口用。。。
    3 条回复    1970-01-01 08:00:00 +08:00
    julyclyde
        1
    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
        2
    g0t3n  
    OP
       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
        3
    julyclyde  
       2014-01-25 16:58:06 +08:00
    @g0t3n 不止是代理服务器。客户端软件对于“目标是HTTPS,代理是HTTP”的情况才会尝试CONNECT方法。如果都是HTTP自然是直接GET/POST的。
    所谓SSL offloader就是对客户端HTTPS对后面HTTP的代理服务器,负责SSL处理。但需要通过某种方法明确告知后面是HTTPS的;据说一些后面的appserver支持特定的header作为标志
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2620 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 04:36 · PVG 12:36 · LAX 21:36 · JFK 00:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.