如何熟悉Squid的SSL碰撞?

Forward Proxy

1 基础知识

1.1 Squid SSL碰撞的介绍

Squid SSL碰撞本质上是使用CA证书(根证书或从属根证书)对上游Web服务器的公钥进行重新签名
Squid SSL碰撞后由于客户端使用重签名的证书透过Squid与上游Web服务交互,因此Squid可以解密并拦截https加密信息
Squid SSL碰撞需要CA证书的公钥和私钥(PEM格式,如私钥有加密需提前解密)
需要注意的是,
– Squid SSL碰撞使用的CA证书为英文“CA Certificate”,也称为根证书(root CA)
– Squid SSL碰撞使用的从属根证书为英文“Subordinate CA Certificate”
– Squid SSL碰撞支持非权威机构CA证书和权威证书机构颁发的CA证书
– Squid SSL碰撞非权威机构CA证书和权威证书机构颁发的CA证书区别是自签名普遍不受浏览器信任
– Squid SSL碰撞为“Squid SSL Bumping”的中文翻译

1.2 Squid SSL碰撞的作用

Squid SSL碰撞是Squid作为中转的代理服务器干预建立加密链接的过程
Squid SSL碰撞协助反病毒和反网络钓鱼软件完成加密的数据通道内传输数据扫描

1.3 工作原理


如上图所示,
– TCP握手阶段,Client发起TCP CONNECT请求,Squid以中介身份创建虚假TCP CONNECT转到Server并回应Client的TCP请求
– TLS握手阶段,Client发起TLS ClientHello,Squid以中介身份接收Server返回TLS ServerHello并回应Client
– 证书变更阶段,Client与Server的证书变更以Squid为中介身份执行对上游Web服务器的公钥进行重新签名来完成
– 数据交换阶段,Client与Server的数据交换以Squid为中介身份执行数据交换操作完成
需要注意的是,
– ciphers,即英文直译密码,这里应该指TLS证书
– SNI为英文“Server Name Indication”的简写

1.4 Squid SSL支持的碰撞操作

– splice模式,
— “splice”中文翻译为拼接
— 该模式充当TCP隧道,不解密代理流量(默认操作)
– bump模式,
– “bump”中文翻译为撞
— 该模式在步骤SslBump1中先与客户端建立安全连接后连接到服务器
— 该模式在步骤SslBump2和3中先与服务器建立安全连接后模拟服务器证书与客户端建立安全连接
– peek模式,
— “peek”中文翻译为窥视
— 该模式在步骤SslBump1中接收客户端或步骤SslBump2中接收服务器证书并窥视证书
— 该模式同时保持拼接连接的可能性(可防止SslBump3连接中断)
– stare模式,
— “stare”中文翻译为盯
— 该模式在步骤SslBump1中接收客户端或步骤SslBump2中接收服务器证书,同事保持碰撞的可能性
– terminate模式,
— “terminate”翻译为终止
— 该模式关闭客户端与服务器的连接

2 最佳实践

2.1 服务环境

2.1.1 系统环境信息

IP Address = 10.168.0.80
Gateway = 10.168.0.1
Operating System = Oracle Linux Server 9.0

Squid Client:
IP Address = 10.168.0.x
Operating System = any

2.1.2 准备编译安装的Squid环境

如何yum部署Squid?

2.1.3 确认已开启编译参数

squid -v | grep enable-ssl-crtd
squid -v | grep with-openssl

2.2 准备服务端证书

2.2.1 部署Squid需要的CA证书以及证书库

mkdir /etc/squid/ssl_cert/
cp bump.crt /etc/squid/ssl_cert/
cp bump.key /etc/squid/ssl_cert/
cp DigiCert_Global_Root_G2.crt /etc/squid/ssl_cert/

以上证书,你需要按照如下教程创建,

如何创建Squid的SSL私签证书?


需要注意的是,
– 文件“bump.crt”为CA证书的公钥证书
– 文件“bump.key”为CA证书的私钥证书
然后你需要创建Diffie-Hellman算法的设置文件,

openssl dhparam -outform PEM -out /etc/squid/ssl_cert/bump_dhparam.pem 2048

然后,你需要执行以下命令,

/usr/lib64/squid/security_file_certgen -c -s /var/lib/ssl_db -M 20MB
chown -R squid:squid /var/lib/ssl_db/ /etc/squid/ssl_cert/
chmod 400 /etc/squid/ssl_cert/*

如果遇到如下错误提示,

Initialization SSL db...
2023/07/31 08:57:08 sslcrtd_program| FATAL: Cannot generate certificates: Cannot create /var/lib/ssl_db
    exception location: certificate_db.cc(374) Create

你需要执行如下命令解决,

rm -rf /var/lib/ssl_db

2.2.2 配置Squid服务端引入证书

vim /etc/squid/squid.conf

如下配置需要放置到第一条“http_access”指令之前,

acl intermediate_fetching transaction_initiator certificate-fetching
http_access allow intermediate_fetching

加入如下配置,

http_port 3128 tcpkeepalive=60,30,3 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=20MB cert=/etc/squid/ssl_cert/bump.crt key=/etc/squid/ssl_cert/bump.key cipher=HIGH:MEDIUM:!LOW:!RC4:!SEED:!IDEA:!3DES:!MD5:!EXP:!PSK:!DSS options=NO_TLSv1,NO_SSLv3,NO_SSLv2,SINGLE_DH_USE,SINGLE_ECDH_USE tls-dh=prime256v1:/etc/squid/ssl_cert/bump_dhparam.pem

sslcrtd_program /usr/lib64/squid/security_file_certgen -s /var/lib/ssl_db -M 20MB
sslproxy_cert_error allow all
ssl_bump stare all

2.2.3 重启服务使配置生效

systemctl restart squid

2.2.4 命令行验证

openssl s_client -connect localhost:3128 --proxy localhost:3128

注:以上连接到代理并打印证书

2.3 代理客户端配置

2.3.1 导入正向代理的证书

单击Firefox的菜单【设置】
然后在查找中搜索关键字“证书”
然后单击【查看证书】->【证书机构】->【导入】
然后导入上面步骤生成的“bump.der”证书文件并勾选【此证书可以标识网站】
单击【确定】即可完成配置

2.3.2 配置代理

单击Firefox的菜单【设置】
然后在查找中搜索关键字“网络设置”
然后单击【设置】->【手动配置代理】
填写“HTTP代理”的值,本章范例为“10.168.0.80”
填写“端口”的值,范例为“3128”
勾选【也将此代理用户HTTPS】
单击【确定】即可完成配置

参阅文档
====================

卡巴斯基SSL碰撞的介绍
————————
https://support.kaspersky.com/KWTS/6.1/en-US/166244.htm

非官方的SSL碰撞介绍
————————
https://www.linkedin.com/pulse/ssl-bumping-robert-smedley
https://cloud-atlas.readthedocs.io/zh_CN/latest/web/proxy/squid/squid_ssl_bumping.html

卡巴斯基SSL碰撞的配置
https://support.kaspersky.com/KWTS/6.1/en-US/166244.htm

SslBump窥视和拼接
————————-
https://wiki.squid-cache.org/Features/SslPeekAndSplice

https://wiki.squid-cache.org/Features/SslBump

SSL碰撞的配置
———————–
https://rasika90.medium.com/how-i-saved-tons-of-gbs-with-https-caching-41550b4ada8a

没有评论

发表回复

Forward Proxy
如何基于openSSH部署Socks代理服务?

1 前言 一个问题,一篇文章,一出故事。 笔者需要实现Socks代理服务以便于内网的电脑客户端可以通 …

Forward Proxy
如何修改Squid的日志格式?

1 前言 一个问题,一篇文章,一出故事。 笔者查看Squid的访问日志发现时间部分是时间戳,笔者感觉 …

Forward Proxy
如何配实现Squid多开实例同时运行?

1 前言 一个问题,一篇文章,一出故事。 笔者整理本文的原因是遇到Squid遇到需要在同一台服务器启 …