分类: 网络与安全
2015-03-14 17:53:08
在各种上网的方法当中,https proxy 可能是最简单、方便、快速的,它免去了 vpn 各种拨号连接的麻烦,也免去了安装各种客户端的麻烦,同时搭建所用的软件也是历史悠久的非常稳定。
吐槽:如果问为什么这么好的方式却很少人用,答案可能是因为它需要较多的¥money,而且可能需要一张双币/多币种信用卡来购买这些东西:一个虚拟服务器 vps,一个域名,一个 SSL 证书。vps 我比较推荐 linode,并不是因为你戳一下这个链接并成功购买后能返回一点零钱给我,而是 linode 相当厚道,它会跟随主流免费为你升级 CPU、内存、硬盘、带宽等等。域名和 SSL 证书大家可以参考我的前一篇《如何购买廉价 SSL 证书》。全部扔上购物车一年大概 $150 以上,捉襟见肘的可以考虑多人合购。
好了说回正题,用于实现 https proxy 的服务端软件很多,可以用老掉牙但很稳定的 squid,也可以随便用一个轻量级的 http proxy 程序搭配老掉牙的 stunnel,或者试试新秀 node-spdyproxy 也可以。
下面介绍一下比较简单的方案:轻量级 http proxy 程序 tinyproxy + stunnel 。
首先使用各个 Linux 发行版的包管理器安装 tinyproxy 和 stunnel,比如:
$ sudo yum install tinyproxy stunnel // 对于 centos linux $ sudo pacman -S tinyproxy stunnel // 对于 arch linux
安装完成后顺便设置它们随开机启动(可选)。
把你证书私钥和购买的证书扔到 /etc/stunnel 里,然后编辑文件 stunnel.conf,先指定私钥和证书文件名:
cert = /etc/stunnel/mycert.pem
key = /etc/stunnel/mykey.pem
需要注意的是从证书服务商购买回来的证书通常是几个小文件,大概有是:一个你的域名证书,一个证书链证书,一个root证书。把它们用文本编辑器打开,然后按照上述的顺序复制粘贴成一个文件,这个文件就是上面 ”cert=“ 这行所需的文件。
然后指定端口转换,比如将端口 443 (https 的默认端口)绑定并转换到 tinyproxy 的默认端口 8888:
[https]
accept = 443
connect = 127.0.0.1:8888
其中 https 这个一项绑定的名称,可以随便起,accept 表示本机监听的端口,connect 表示转换到哪里。完整的意思就是为 127.0.0.1:8888 添加 SSL 加密层,然后通过 443 端口对外服务。
目前默认支持 https/spdy 代理的只有 google chrome 浏览器(其他浏览器需要在客户端运行 stunnel 把 https 翻译为 http 才能使用)。而且很诡异的是 chrome 没有自己独立设置 proxy 的地方,使用系统全局的那个 https 设置是不行的(因为系统那个 https 代理指的是当你访问 https 的网站时所走的 http 代理通道,跟我们这篇说的 https proxy 是两码事),所以你还得在 chrome 浏览器里安装插件 TunnelSwitch,然后在这个插件里设置 https 代理为:“你的网站域名:443”,这样所有工作都完成可以直接上网了。
如果想节省购买 SSL 证书的花费,那么自己生成一个“自签名”的证书也是可以的,不过如果你的 proxy 想共享给其他人使用的话,要慎重考虑这种方式,因为它会让不爱折腾的人觉得很折腾。
用下面命令即可生成一个自签名证书:
openssl genrsa -out key.pem 1024 openssl req -new -key key.pem -subj "/CN=localhost" -out req.pem openssl x509 -req -days 365 -in req.pem -signkey key.pem -out cert.pem
注意要将上面的 localhost 更改为你的域名,最终有用的分别是私钥文件 key.pem 和证书文件 cert.pem,把这两个文件替换上面第二步所提到的位置即可。
然后在客户端需要导入这个 cert.pem 才能顺利使用你所搭建的 https proxy 服务。各个操作系统的导入证书方法都不太相同。
$ certutil -d "sql:$HOME/.pki/nssdb" -A -n dummy -i cert.pem -t C
然后重启你的 chrome 浏览器就可以了。