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(机构)。
警告
如果这个自签名根证书被泄漏,则任何信任(有意或无意)你的根证书的用户将无法检测到由其他人策划的中间人攻击!!!
创建存储证书目录:
cd /etc/squid
mkdir ssl_cert
chown proxy:proxy ssl_cert
chmod 700 ssl_cert
cd ssl_cert
使用OpenSSL创建证书:
openssl req -new -newkey rsa:2048 -sha256 -days 3650 -nodes -x509 -extensions v3_ca -keyout myCA.pem -out myCA.pem
如果使用GnuTLS来完成,也可以使用如下命令:
certtool --generate-privkey --outfile ca-key.pem
certtool --generate-self-signed --load-privkey ca-key.pem --outfile myCA.pem
创建DER-encoded证书以便导入到客户端浏览器
执行以下命令构建提供给客户端的证书:
openssl x509 -in myCA.pem -outform DER -out myCA.der
生成的 myCA.der
提供给客户端浏览器导入
备注
由于我改为 HTTP 方式实现 配置Docker使用代理 服务端代理,所以暂时没有做进一步实践。原文还有不少技术细节和解决方案,待以后有机会再学习实践。
企业级应用
著名的安全公司 卡巴斯基 有一款集成了 HAProxy (七层负载均衡) 和 Squid代理服务 (正向代理)的WEB流量安全产品,实现企业级的安全:
Kaspersky Web Traffic Security 会扫描通过代理服务器的用户 HTTP、 HTTPS 和 FTP 流量
HAProxy 实现复杂的内网向外流量分发负载均衡到 Squid代理服务 ,由
Squid
实现集成企业认证、杀毒、跟踪分析、缓存等代理服务,实现公司级WEB/邮件等安全控制由于企业会在公司设备上安装企业证书,所以 Squid SSL拦截 可以实现HTTPS明文过滤
Kaspersky Web Traffic Security帮助: 在 Squid 服务中配置 SSL Bumping 可以了解 Squid SSL拦截 为企业内部控制用户上网行为提供了技术基础
参考
Intercept HTTPS CONNECT messages with SSL-Bump Squid官方文档,非常详尽的配置
SSL-Bump using an intermediate CA Squid官方wiki,精简说明
Squid使用SSLBump正向代理 提供了一个解决访问https网站证书修正的思路,原文参考了 Squid (v3.5+) proxy with SSL Bump 提供了不少借鉴思路