Squid SSL拦截

警告

HTTPS拦截需要注意道德和法律问题!!!

Intercept HTTPS CONNECT messages with SSL-Bump Squid官方文档开头提供了警告和建议… 对于一些国家

HTTPS拦截是Squid-3.5开始提供的功能,需要注意 TLS 是一种安全协议,明确旨在是安全通讯成为可能,并且防止未经监测点第三方(例如 squid)拦截流量,

如果正确使用,TLS不能被拦截 ( when used properly TLS cannot be “bumped”. )

即使是错误使用TLS通常也会使得通行通道的至少一端检测到代理的存在。 Squid SSL-Bump 是有意以允许在不破坏TLS的的情况下进行检测的方式实现的。此时客户端是能够识别代理存在,所以如果寻求一种完全保密的方法,不应该使用squid。

使用原理

在家庭和公司环境,客户端设备可以配置使用代理或者HTTPS消息使用 CONNECT 消息通过代理发送。要拦截这种 HTTPS 流量,需要向 Squid 提供 自签名CA证书的公钥和私钥 ,而Squid则使用自签名CA证书的公钥和私钥为HTTPS域客户端访问生成服务器证书。此时,客户端设备需要配置为在验证Squid生成的证书时信任CA证书。

备注

Squid透明代理 也是使用了本文 Squid SSL拦截 配置,只不过进一步结合了iptables做端口转发,以便减少客户端配置

创建自签名Root CA证书

Squid使用自签名Root CA证书为被代理的网站生成动态证书。这个自签名根证书是一个Root Certificate,而你自己就是根CA(机构)。

警告

如果这个自签名根证书被泄漏,则任何信任(有意或无意)你的根证书的用户将无法检测到由其他人策划的中间人攻击!!!

  • 创建存储证书目录:

创建CA证书存储目录(位置不重要)
cd /etc/squid
mkdir ssl_cert
chown proxy:proxy ssl_cert
chmod 700 ssl_cert
cd ssl_cert
  • 使用OpenSSL创建证书:

使用openssl创建CA证书
openssl req -new -newkey rsa:2048 -sha256 -days 3650 -nodes -x509 -extensions v3_ca -keyout myCA.pem  -out myCA.pem

如果使用GnuTLS来完成,也可以使用如下命令:

使用GnuTLS的certtool创建CA证书
certtool --generate-privkey --outfile ca-key.pem
certtool --generate-self-signed --load-privkey ca-key.pem --outfile myCA.pem

创建DER-encoded证书以便导入到客户端浏览器

  • 执行以下命令构建提供给客户端的证书:

构建浏览器客户端使用的 DER-encoded certificate
openssl x509 -in myCA.pem -outform DER -out myCA.der

生成的 myCA.der 提供给客户端浏览器导入

备注

由于我改为 HTTP 方式实现 配置Docker使用代理 服务端代理,所以暂时没有做进一步实践。原文还有不少技术细节和解决方案,待以后有机会再学习实践。

企业级应用

著名的安全公司 卡巴斯基 有一款集成了 HAProxy (七层负载均衡) 和 Squid代理服务 (正向代理)的WEB流量安全产品,实现企业级的安全:

参考