[关闭]
@delight 2014-05-02T12:37:50.000000Z 字数 2389 阅读 7484

Squid SSL 相关特性总结

squid ssl
squid支持各种不同的SSL使用,包括以下三种情况:

  1. 经过SSL包装的http请求
  2. 经过http代理的https请求
  3. 作为中间人对https响应进行解密并重新加密

所有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_portssl-bump选项,最好还要打开动态证书生成(需要在编译时启用--enable-ssl-crtd选项)。此时squid会解密https网站相关的请求和应答,并进行缓存。

但是,这个特性有个bug,这个bug直到squid3.3才被修正(另外,3.3增加了此特性),在此版本之前,squid并没有把https请求重新加密然后再转发到cache_peer,而是roll back到普通的http请求。在3.3版本以后,可以通过打开cache_peerssl选项,激活重新加密的功能。

注意,经过测试,该特性并不能重新加密那些本来属于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. 针对情况1,只需要让squid监听https端口即可,此时squid会自动解密客户端请求,并将原始请求(http或CONNECT)转发到original server或parent proxy,如果做反向代理,此时可使用网站的证书(并打开defaultsite选项)。如果只是用来翻墙,可以自己签发证书(自己制作CA,客户端的操作系统/浏览器导入证书)。

  2. 情况3的设置比较复杂,这里有一个参考的配置:

监听部分:

  1. #使用动态证书生成
  2. http_port 3128 ssl-bump generate-host-certificates=on \
  3. dynamic_cert_mem_cache_size=4MB \
  4. cert=/usr/local/etc/cert.pem key=/usr/local/etc/key.pem
  5. #acl 相关
  6. ssl_bump allow all
  7. #认证控制
  8. sslproxy_cert_error allow all
  9. sslproxy_flags DONT_VERIFY_PEER
  10. #动态证书的外部程序
  11. sslcrtd_program /usr/local/libexec/ssl_crtd -s /usr/local/var/ssl_db -M 4MB

转发部分:

  1. #父代理
  2. cache_peer www.xxx.com parent 443 0 name="proxy" ssh \
  3. sshcafile=/usr/local/etc/ca.crt
  4. #acl相关
  5. cache_peer_access proxy allow SSL_PORT
  6. cache_peer_access www.xxx.com deny !SSL_PORT
  7. #转发白名单
  8. 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。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注