@delight
2014-05-02T20:37:50.000000Z
字数 2389
阅读 7680
squid
ssl
squid支持各种不同的SSL使用,包括以下三种情况:
所有SSL相关特性均需要在编译squid时启用--enable-ssl
选项。
下面分别讨论:
对于情况1, 也就是客户端所有的http请求经过SSL加密,常见的情况有两种:chrome浏览器直接使用-proxy-server=https://xxx.com
启动https代理(或者使用pac文件return HTTPS xxx.com
);任意浏览器使用stunnel进行代理转换。
squid可以使用https_port
监听这类请求,通过指定cert和key来与客户端进行通信,这一特性往往用于https网站的反向代理,这时cache_peer的parent proxy就是original server。
情况2比较简单,不用做什么特殊设置。squid默认接受CONNECT
首部,对https网站的请求进行盲转。另外,情况1中,做正向代理时,如果不启用ssl-bump
选项,squid不会解密HTTPS网站的相关信息(CONNECT),但是会解密被SSL加密的HTTP请求(即本来是http网站的请求)。
情况3比较复杂,使用该特性不需要启用https_port
监听,但是需要打开http_port
的ssl-bump
选项,最好还要打开动态证书生成(需要在编译时启用--enable-ssl-crtd
选项)。此时squid会解密https网站相关的请求和应答,并进行缓存。
但是,这个特性有个bug,这个bug直到squid3.3才被修正(另外,3.3增加了此特性),在此版本之前,squid并没有把https请求重新加密然后再转发到cache_peer,而是roll back到普通的http请求。在3.3版本以后,可以通过打开cache_peer
的ssl
选项,激活重新加密的功能。
注意,经过测试,该特性并不能重新加密那些本来属于http的请求(换言之,squid没有stunnel那种转换http为https的能力),只能配合ssldump将CONNECT请求重新封包。如果强制http请求也转发到二级缓存的443端口,cache_log
中会出现大量“SSL routines:SSL23_GET_CLIENT_HELLO:https proxy request”错误提示,这意味着侦听到的实际是http请求。
ubuntu12.04源里面的squid版本是3.1.x,所以如果要装3.3版本,必须要自己下载编译安装,可以参考这里,这里面的选项中没有--enable-ssl-crtd
,需要自己加上。
针对情况1,只需要让squid监听https端口即可,此时squid会自动解密客户端请求,并将原始请求(http或CONNECT)转发到original server或parent proxy,如果做反向代理,此时可使用网站的证书(并打开defaultsite
选项)。如果只是用来翻墙,可以自己签发证书(自己制作CA,客户端的操作系统/浏览器导入证书)。
情况3的设置比较复杂,这里有一个参考的配置:
监听部分:
#使用动态证书生成
http_port 3128 ssl-bump generate-host-certificates=on \
dynamic_cert_mem_cache_size=4MB \
cert=/usr/local/etc/cert.pem key=/usr/local/etc/key.pem
#acl 相关
ssl_bump allow all
#认证控制
sslproxy_cert_error allow all
sslproxy_flags DONT_VERIFY_PEER
#动态证书的外部程序
sslcrtd_program /usr/local/libexec/ssl_crtd -s /usr/local/var/ssl_db -M 4MB
转发部分:
#父代理
cache_peer www.xxx.com parent 443 0 name="proxy" ssh \
sshcafile=/usr/local/etc/ca.crt
#acl相关
cache_peer_access proxy allow SSL_PORT
cache_peer_access www.xxx.com deny !SSL_PORT
#转发白名单
cache_peer_domain proxy .google.com
这里给出一个参考的二级缓存架构:
http spdy http
Client/Browser------>Shrpx-client-------->Shrpx-server------->squid-child(cluster)------>
Just for gfw blacklist
http spdy http
-------->Shrpx-client------>Shrpx-server--------->squid-parent(cluster)--->ziproxy--->server
Just for gfw blacklist
对于gfw黑名单网站,需要加密/解密两次才能达到二级缓存的效果。由于parent squid在墙外,所以可以通过child squid的acl控制:对于国内的网站,不必再转发到parent squid,而是转发给ziproxy,然后直连网站。如果想要对spdy加密也进行一次过滤,可以考虑在Shrpx-client上游再加一个squid进行转发控制;当然,这一过程也可以内建在浏览器内核中。
另外,从squid的开发路线图可以看出,squid到3.5以后,可以支持直接解密spdy协议,这样就可以避免架构中的Shrpx-server。