Pages

Friday, 1 April 2016

通过Stunnel+Privoxy建立SSL Http Proxy服务器及客户端(windows server上实现)

Http Proxy 没有加密,连 HTTP/1.1 协议的用户密码也是明文传输的,网络嗅探器这么多,实在不安全。如何建立一个高度安全的 Http Proxy,保证服务器和客户端之间的通信安全?通过 Stunnel + Privoxy 可以做到。
SSL Http Proxy 服务器:
Privoxy (提供 Http 代理) —> 通过 Stunnel 把 Http 代理映射/转换成 SSL 代理
SSL Http Proxy 客户端:
通过 Stunnel 把 SSL 代理映射/转换成 Http 代理 —> 在浏览器设置 Http 代理
这样服务器和客户端之间的通信就有了 SSL 加密保障。
涉及的软件:
Stunnel: Socket端口 SSL 加密/解密、映射/转换,需要 OpenSSL 库
Openssl: 提供 SSL 加密/解密动态库(libeay32.dll、libssl32.dll、openssl.exe)
Privoxy: Http Proxy 服务器
这三个软件在 MS Windows 和 Linux 下都有相应版本,并且是 OpenSource 的软件(奔放、自由)。三个软件都很优秀。OpenSSL 不用说了;Stunnel 两年前我就在用,使用也很稳定;Privoxy 的前身也是 Http Proxy 服务器,多年的实际使用,有广泛的用户。
为了便于初次使用者方便,我写下了 MS Windows 下的安装及使用步骤
测试平台:MS Windows 2000 (三个软件兼容 MS Windows XP/2000/NT/98)
SSL Http Proxy 服务器安装:
1、安装 Privoxy
先下载 Privoxy 软件,http://sourceforge.net/projects/ijbswa/ 的下载, MS Windows 只有图形版本,控制台版本需要下载源程序编译,或使用我编译好的(见附件)。这里使用的是 privoxy-3.0.0-stable 版的控制台版本/图形版本进行测试。
2、配置 Privoxy
Privoxy 的主要配置文件是 config.txt
通过编辑软件打开,如:记事本–notepad。config.txt中有几个重要的选项:
1、listen-address : Http Proxy 的端口,默认的是127.0.0.1:8118
2、logfile privoxy.log :记录,如果不指定文件名将不记录,但会打印在屏幕
3、jarfile jar.log :客户端 cookies 的记录存放文件,如果不指定文件名,客户端无法使用 cookies
4、permit-access、deny-access :允许/拒绝的IP/域名,建议只允许 localhost “permit-access localhost”,外部的网络通过 Stunnel 提供的 SSL 加密代理
config.txt 的这些配置满足一般需要了,其他的请看 config.txt 内的注释。
Privoxy 还有其他的配置文件,用于过滤网站、广告等功能扩展,因为不是必须的配置,略。
3、运行 Privoxy
Http 代理出来了,它向 Stunnel 提供一个 Http 代理端口。
4、安装 Stunnel
下载 Stunnel 软件。这里使用的是 stunnel-4.00.exe 版。Stunnel需要 OpenSSL 库支持,所以还要下载 Openssl 的支持文件–libeay32.dll、libssl32.dll、openssl.exe。将下载的文件放到同一个目录下。
5、创建服务器证书
Stunnel 客户方式不需要证书。Stunnel 服务方式需要一个证书文件。
Stunnel 在 SSL Http Proxy 服务器是以服务方式运行的,所以必须要有一个证书。通过 openssl.exe 创建服务器证书。下面我将 Stunnel 关于创建证书的翻译如下:
“…运行下面的命令
openssl req -new -x509 -days 365 -nodes -config openssl.cnf -out stunnel.pem -keyout stunnel.pem
这将会创建一个自己给自己签名的证书。参数的含义:
-days 365
使这个证书的有效期是1年,之后它将不能再用。
-new
创建一个新的证书
-x509
创建一个 X509 证书(自己签名的)
-nodes
这个证书没有密码
-config openssl.cnf
OpenSSL 使用的配置文件 (可能需要修改的有[CA_default]和[req_distinguished_name]这两个 section,译者)
-out stunnel.pem
把 SSL 证书写到哪里
-keyout stunnel.pem
把 SSL 证书放到这个文件中
这个命令将会问你以下问题:
问题的回答示范
Country name PL, UK, US, CA
State or Province name Illinois, Ontario
Locality Chicago, Toronto
Organization Name Bill’s Meats, Acme Anvils
Organizational Unit Name Ecommerce Division
Common Name (FQDN) www.example.com
注意:Common Name (FQDN) 应该是运行 stunnel 机器的主机名。如果你能通过不同的主机名访问这台机器,有些 SSL 客户会警告这个主机的证书有问题,所以最好是使它和用户访问的主机名匹配。
openssl gendh 512>> stunnel.pem
这将生成 Diffie-Hellman 部分, 追加到 pem 文件中。这个只有在你指定 stunnel 使用 DH 才需要, 但默认是不用的。(实际好象是必须的,可能是后来改了,译者)
openssl x509 -subject -dates -fingerprint -in stunnel.pem
这个命令是将你的证书信息在屏幕显示出来。”
6、配置/运行 Stunnel
stunnel-4.00 默认配置文件是 stunnel.conf
下面是最小的服务方式配置文件内容示范:
key = stunnel.pem
[http2ssl]
accept = 443
connect = 127.0.0.1:8118
含义:使用 stunnel.pem 证书,将 127.0.0.1: 8118 的端口加密映射成本机443端口,“ http2ssl ”是名称,可以改成其他的标识。
配置文件文件还有其他内容,详情请看帮助。
直接运行stunnel-4.00.exe,就可以启动 Stunnel 了。
7、将Stunnel 安装成 MS NT 服务方式(可选)
stunnel-4.00.exe 也可以作为 MS NT 服务方式启动,在 Stunnel 所有设置完成后,运行 stunnel-4.00.exe -install 将会安装成服务。
安装成服务后
运行 net start “stunnel 4.00″ 启动 stunnel 4.00 服务。
运行 net stop “stunnel 4.00″ 停止 stunnel 4.00 服务。
运行 stunnel-4.00.exe -uninstall 卸载 stunnel 4.00 服务。
注意:即使是 MS NT 服务方式启动,当启动 stunnel 4.00 服务的时候,在托盘还是有 Stunnel 的图标。不想托盘有 Stunnel 的图标,可以用 stunnel-3.22 控制台版本。
stunnel-3.22 控制台的简要说明:
服务器运行参数示范:
stunnel-3.22.exe -d 443 -r 127.0.0.1:8118
含义将 127.0.0.1:8118 的端口加密映射成本机443端口
客户端运行参数示范:
stunnel-3.22.exe -c -d 127.0.0.1:80 -r 192.168.0.1:443
含义将 192.168.0.1:443 的端口解密映射成本机80端口
这样 SSL Http Proxy 服务器就完成了。
下面看看客户端是怎么使用的
因为 SSL Http Proxy 是特殊的 Http 代理,所以客户端不能直接使用,需要下载软件 Stunnel。
客户端使用:
1、安装 Stunnel
下载 Stunnel 软件。这里使用的是 stunnel-4.00.exe 版。Stunnel需要 OpenSSL 库支持,所以还要下载 Openssl 的支持文件–libeay32.dll、libssl32.dll。将下载的文件放到同一个目录下。
2、配置/运行 Stunnel
stunnel-4.00 默认配置文件是 stunnel.conf
下面是最小的客户方式配置文件内容示范:
client = yes
[ssl2http]
accept = 127.0.0.1:80
connect = 192.168.0.1:443
含义:使用客户方式方式,将 192.168.0.1:443 的端口解密映射成本机80端口,“ ssl2http ”是名称,可以改成其他的标识。
accept设置为127.0.0.1:80,只允许127.0.0.1–本机使用这个80端口代理,禁止了其他人使用你的机器作代理 。
配置文件文件还有其他内容,详情请看帮助。
直接运行stunnel-4.00.exe,就可以启动 Stunnel 了。
3、在浏览器设置 Http 代理
现在代理是:127.0.0.1:80。注意在 IE 设置 Http 代理时,“ IE |工具| Internet 选项|连接”有两种:“局域网(LAN)设置”和“拨号和虚拟专用网络设置”。“局域网(LAN)设置”对局域网生效;“拨号和虚拟专用网络设置”对拨号 网络生效。
但有时“拨号和虚拟专用网络设置”设置的代理会失效,不通过代理直接访问网站。原因可能是多种上网环境,显式的是拨号上网,还有隐式的 NAT、DHCP(有些是这样)。通过隐式的方式出去,就出现“拨号和虚拟专用网络设置”设置的代理失效。可以将“局域网(LAN)设置”和“拨号和虚拟 专用网络设置”都设置代理来避免这种情况。
现在客户端就畅快的通过 SSL Http Proxy 来浏览网站吧!
后记
Stunnel 的用途很多,通过类似的方法,我们可以给 Smtp/Pop3、Socks4/5、Ftp 等加上 SSL 隧道,甚至可以创建 VPN 。e-Border 有类似的解决方案–加密的Socks5代理,但不是免费的。
这里涉及 Stunnel 的使用是最简单的一种,如客户端也有证书认证等,没有涉及。Privoxy 这里也简单运用,Privoxy 的其他功能,如过滤恶意的广告等,也没有涉及。

相关网站:
http://www.stunnel.org
http://www.openssl.org/ 

(http://gnuwin32.sourceforge.net/packages/openssl.htm,
http://sourceforge.net/projects/gnuwin32/files/openssl/
http://downloads.sourceforge.net/project/gnuwin32/openssl/0.9.8h-1/openssl-0.9.8h-1-setup.exe
http://downloads.sourceforge.net/project/gnuwin32/openssl/0.9.8h-1/openssl-0.9.8h-1-doc.zip
参考:http://www.slproweb.com/products/Win32OpenSSL.html)
http://sourceforge.net/projects/ijbswa/

-----------------------------------------------------
关于SOCKS5的SSL代理通道
通过建立一个SOCKS5的SSL代理通道,结合客户端软件的搭配使用,可以让我们从网络彻底隐身,Surf Everywhere U Want.

先简单介绍一下代理的分类:

代理分:Level 1~Level 5 五个等级;
或者也可以分为3类:·
A .全匿名代理 不改变你的Request Fields,使服务器端看来就像有个真正的客户浏览器在访问它。当然,你的真实IP是隐藏起来的。服务器的网管不会认为你使用了代理。

普通匿名代理 能隐藏你的真实IP,但会更改你的Request
Fields,有可能会被认为使用了代理,但仅仅是可能,一般说来是没问题的。不过不要受它的名字的误导,其安全性可能比全匿名代理更高,有的代理会剥离
你的部分信息(就好比防火墙的Stealth Mode),使服务器端探测不到你的操作系统版本和浏览器版本。
C· 透明代理(简单代理) 改编你的Request Fields,并会传送真实IP。 你访问的网站会把你看的一清二楚,知道你用了代理,知道代理的IP,也知道你的真实IP。
一般Level3?-Level5属于 透明代理; Level 1-Level3 属于匿名代理! 全匿名代理有时也称为超级代理!

不让网管(国内代理服务器}或者ISP(国外代理服务器)知道我想去哪去过哪,那把你的连接请求用SSL加密就行了.

有了匿名功能再加上加密的连接,隐身术终于练成!

制作和使用这个代理需要的软件是CCPROXY 6.2,STUNNEL,OPENSSL,SOCKSCAP.都是免费软件,CC3个用户就够了.


假设你已经有了一台远程机器A做代理服务器,你自己的机器为B.

在A
机上,我们要开一个SOCKS5的本地代理端口,并且用SSL加密他的传输.首先,在CCPROXY里启用SOCKS5的代理服务,假设端口是1080,
创建一个用户,验证方式为用户名/密码/IP混合,假设用户名密码都是ccf,IP为127.0.0.1,记得顺便把"禁止局域网外用户访问"勾上,因为
远程的B机不会直接访问这个服务,免得老人人来扫密码.下面是关键,打开CCPROXY.INI文件,修改并确认下面2个参数:

EnableProxyConnection=0
EnableReferer=0

这样别人就不知道你使用了代理,也不知道你从哪儿来.好像CC6.0也支持这两个参数,不过官方是6.3才在FAQ里面写出来.

然后配置STUNEEL.CONF文件,内容如下:

cert=stunnel.pem
key = stunnel.pem
taskbar=no #这个参数可以隐藏STUNELL的图标,如果做坏事就用$%#%#
client=no

[socks2ssl]
accept = 80 #在80端口监听,准备接受外部连接.
connect = 127.0.0.1:1080 #连接CCPROXY开的SOCKS5服务端口

把监听端口设为80的原因是极端的假设B机前面的防火墙只允许B机访问80端口,如果没这个限制,随便设一个.

代理服务器做好了,我们要配置一下B机这个客户端.

首先是客户端的STUNNEL.CONF

client = yes

[ssl2SOCKS]
accept = 127.0.0.1:8282 #在本地启用8282端口的SOCKS5代理服务
connect = AAA.AAA.AAA.AAA:80 #连接到你的代理服务器A,地址或者域名+端口

然后设置SOCKSCAP,设置代理类型SOCKS5,地址127.0.0.1,端口8282,用户密码验证(启动SOCKSCAP会让你输入),DNS解析选先本地再远程.

最后,把你的浏览器,例如IE,拉入SOCKSCAP,可以去 http://proxyjudge.org/
验证你的匿名度了!