🔗 使用 SSL-Bump 拦截 HTTPS CONNECT 消息
HTTPS 拦截涉及道德和法律问题,您需要了解这一点。
- 一些国家/地区不对家庭环境中的行为进行限制,
- 一些国家/地区允许雇佣法或合同法凌驾于隐私之上,
- 一些国家/地区要求对所有解密服务进行政府注册,
- 在一些国家/地区,这是被视为极恶劣的资本犯罪,将面临严厉处罚。
- 请务必在使用此配置之前寻求法律建议,即使是在家中。
从道德层面讲;请设想一下,一个您不认识的陌生人正在阅读您所有的私人通信。您希望他们如何对待这些信息?请善待他人。
🔗 目录
此配置是为 Squid-3.5 编写的。它绝对无法在旧版 Squid 上运行,即使它们具有某种形式的 SSL-Bump 功能,并且如果 TLS 协议环境有任何重大改进,它也可能在新版本上无法运行。
TLS 是一种安全协议,其明确目的是实现安全通信并防止第三方(如 Squid)未经检测地拦截流量。
正确使用时 TLS 无法被“绕过”。
即使 TLS 使用不当,通常也能让通信通道至少一端检测到代理的存在。Squid SSL-Bump 的实现方式是故意允许这种检测而不破坏 TLS。您的客户端 **将** 能够识别代理的存在。如果您正在寻找一种完全秘密地进行的方法,请不要使用 Squid。
🔗 用法
在家庭或公司环境中,客户端设备可以被 配置 为使用代理,并且 HTTPS 消息通过 CONNECT 消息使用代理发送。
要拦截此 HTTPS 流量,Squid 需要同时提供自签名 CA 证书的公钥和私钥。它将使用这些密钥为客户端访问的 HTTPS 域生成服务器证书。
客户端设备还需要被配置为在验证 Squid 生成的证书时信任此 CA 证书。
🔗 创建自签名根 CA 证书
此证书将由 Squid 用于为代理站点生成动态证书。在所有实际用途中,此证书将成为一个 根证书,而您将成为一个根 CA。
如果您的证书被泄露,任何信任(知情或不知情)您的根证书的用户可能无法检测到他人策划的中间人攻击。
创建用于存储证书的目录(具体位置不重要)
cd /etc/squid
mkdir ssl_cert
chown squid:squid ssl_cert
chmod 700 ssl_cert
cd ssl_cert
创建自签名证书(系统将要求您提供将包含在证书中的信息)
使用 OpenSSL
openssl req -new -newkey rsa:2048 -sha256 -days 365 -nodes -x509 -extensions v3_ca -keyout myCA.pem -out myCA.pem
使用 GnuTLS certtool
certtool --generate-privkey --outfile ca-key.pem
certtool --generate-self-signed --load-privkey ca-key.pem --outfile myCA.pem
您也可以在 openssl.cfg 中指定一些必需的附加 CA 属性来减少提问。
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
[ v3_ca ]
keyUsage = cRLSign, keyCertSign
🔗 创建 DER 编码的证书以导入用户浏览器
openssl x509 -in myCA.pem -outform DER -out myCA.der
结果文件 (myCA.der) 应导入到用户浏览器中的“证书颁发机构”部分。
例如,在 FireFox 中
- 打开“首选项”
- 转到“高级”部分,“加密”选项卡
- 按“查看证书”按钮,然后转到“证书颁发机构”选项卡
- 按“导入”按钮,选择之前创建的 .der 文件,然后按“确定”
理论上,您必须将您的根证书导入浏览器,或者指示用户如何执行此操作。不幸的是,知名根 CA 普遍 采取的做法 是颁发下级根证书。如果您从用户已经信任的根 CA 获得了此类下级根证书,则无需将证书导入浏览器。然而,走这条路可能会导致知名根 CA 证书在世界各地的浏览器中被移除。此移除将导致您的本地基于 SslBump 的基础设施失效,直到您导入证书为止,但这可能只是您麻烦的开始。受影响的根 CA 会不会追究您的责任以弥补其全球损失?当您的用户得知您未经他们同意就解密了他们的流量时,他们会怎么做?
🔗 Squid 配置文件
Squid 必须使用
./configure \
--with-openssl \
--enable-ssl-crtd
像这样粘贴配置文件
http_port 3128 ssl-bump \
cert=/etc/squid/ssl_cert/myCA.pem \
generate-host-certificates=on dynamic_cert_mem_cache_size=4MB
# For squid 3.5.x
sslcrtd_program /usr/local/squid/libexec/ssl_crtd -s /var/lib/ssl_db -M 4MB
# For squid 4.x
# sslcrtd_program /usr/local/squid/libexec/security_file_certgen -s /var/lib/ssl_db -M 4MB
acl step1 at_step SslBump1
ssl_bump peek step1
ssl_bump bump all
🔗 其他信任根
在某些情况下,您可能需要指定自定义根 CA 添加到库的默认“全局受信任 CA”集中。这可以通过以下方式完成:
Squid-4 及更高版本
tls_outgoing_options cafile=/usr/local/openssl/cabundle.file
注意:OpenSSL CA 的捆绑包源自 Mozilla 的捆绑包,并且不完整。特别是,大多数中间证书未包含在内(见下文)。以这种方式添加额外的根 CA 是您的责任。另请注意,在使用 OpenSSL 时,您需要在 Squid 使用添加的证书之前运行 c_rehash 工具。注意——您不能随意获取任何 CA。使用前请检查!
🔗 缺少中间证书
一些全局根服务器使用中间证书进行签名,有时服务器不会在链中提供到达其根 CA 的所有中间证书。
Squid-4 能够下载缺失的中间 CA 证书,就像流行的浏览器一样。
对于 Squid-3.5,可以使用 sslproxy_foreign_intermediate_certs 指令从文件中加载中间 CA 证书。
sslproxy_foreign_intermediate_certs /etc/squid/extra-intermediate-CA.pem
较旧版本的 Squid 无法很好地处理中间 CA 证书。您可能可以找到针对特定情况的各种解决方法,但强烈建议在处理 HTTPS/TLS 流量时至少升级到最新的 Squid-3.5 版本。
🔗 创建并初始化 TLS 证书缓存目录
最后,您需要创建并初始化 TLS 证书缓存目录,并设置权限以允许 Squid 访问。
crtd 助手会将模拟的证书存储在此目录中。squid 的低权限账户需要读取和写入此目录的权限。
/usr/local/squid/libexec/ssl_crtd -c -s /var/lib/ssl_db -M 4MB
chown squid:squid -R /var/lib/ssl_db
Squid-4 及更高版本
/usr/local/squid/libexec/security_file_certgen -c -s /var/lib/ssl_db -M 4MB
chown squid:squid -R /var/lib/ssl_db
低权限账户因操作系统而异,在您的系统中可能不是 ‘squid’。
另外,请注意 SELinux 和 AppArmour 权限可能需要更新才能允许 Squid 助手使用此目录。
仅当 squid 配置了 --enable-ssl-crtd 时才使用证书缓存目录。否则,bump 会工作,但不会将任何证书存储在任何地方。
🔗 故障排除
对于 Squid-3.1,在某些情况下,您可能需要在 Squid 配置中添加一些选项。
sslproxy_cert_error allow all
sslproxy_flags DONT_VERIFY_PEER
警告! 这可以减少 cache.log 中的 SSL/TLS 错误,但不安全! 使用这些选项,您的缓存将忽略所有服务器证书错误,并允许用户连接它们。请自行承担使用这些选项的风险。
注意,DONT_VERIFY_PEER 即使是调试也不好。因为它很可能会隐藏您试图识别和修复的错误。
注意:sslproxy_cert_error 可用于精炼服务器的证书错误并控制对其的访问。请谨慎使用。
为了提高安全性,最好设置这些选项
# SINGLE_DH_USE is 3.5 before squid-3.5.12-20151222-r13967
# SINGLE_ECDH_USE is AFTER squid-3.5.12-20151222-r13967
# for Squid-3.5 and older
sslproxy_options NO_SSLv2,NO_SSLv3,SINGLE_DH_USE
# for Squid-4 and newer
tls_outgoing_options options=NO_SSLv3,SINGLE_DH_USE,SINGLE_ECDH_USE
SSL 选项必须用逗号(,)或冒号(:)分隔,而不是空格!
NO_SSLv2 仅与 Squid-3.x 相关。SSLv2 支持已从 Squid-4 中完全移除。
因此,您可能会在 cache.log 中看到更多错误。因此,您必须单独调查每种情况并根据需要进行纠正。
🔗 加固
- 作者:Yuri Voinov
重要的是要提高您在嗅探连接中看不见的连接部分
- 从代理到服务器。
默认情况下,您使用的是默认的密码套件集。并且从外部从未检查过您的 SSL 连接。
要实现这一点,您可以使用 此链接 作为示例。只需从代理后面的客户端将浏览器指向此 URL 即可。
大多数情况下,您会看到导出/弱密码套件的使用。
要进行加固,您可以设置 Mozilla 提供的密码套件列表(这是一行)
sslproxy_cipher EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS
结合上面的 sslproxy_options 或 tls_outgoing_options,您可以提高出站 TLS 连接的安全性。
一个好的结果应该看起来像这样

这看起来对出站 SSL 连接更好。
注意:您的浏览器显示了从代理到客户端的连接安全信息。但您了解从代理到服务器的连接安全性很重要。别忘了密码套件。
注意:某些 HTTPS 网站将阻止使用上述密码套件的连接。因此,为了使其正常工作,您可以将 HIGH 密码套件添加到此密码套件列表中。请记住,这会使您的配置稍弱,但兼容性更强。您的密码套件行将如下所示:
sslproxy_cipher EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:HIGH:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS
注意:密码套件的使用也取决于您的 SSL/TLS 库。在某些情况下,指定以下内容就足够了
sslproxy_cipher HIGH:MEDIUM:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS
or
tls_outgoing_options cipher=HIGH:MEDIUM:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS
注意:别忘了,sslproxy_cipher/tls_outgoing_options 对外部(即从 Squid 到 Web)连接有效。对于内部(即从 Squid 到 LAN)连接,您还需要在 http_port/https_port 中指定密码套件。
🔗 现代 DH/EDH 密码套件使用
要使 Squid 能够使用现代 DH/EDH 交换/密码套件,您必须(取决于您的 openssl 构建)创建一个 DH 参数文件并在 http(s)_port 中指定它。
为此,首先创建 DH 参数文件
# openssl dhparam -outform PEM -out dhparam.pem 2048
然后将 dhparams= 或 tls-dh= 选项添加到您的嗅探端口规范中(取决于 Squid 的版本)。
Squid 3.x
# dhparams= File containing DH parameters for temporary/ephemeral
# DH key exchanges. See OpenSSL documentation for details
# on how to create this file.
# WARNING: EDH ciphers will be silently disabled if this
# option is not set.
https_port 3127 intercept ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/usr/local/squid/etc/rootCA.crt key=/usr/local/squid/etc/rootCA.key options=NO_SSLv3 dhparams=/usr/local/squid/etc/dhparam.pem
Squid 4.x
# tls-dh=[curve:]file
# File containing DH parameters for temporary/ephemeral DH key
# exchanges, optionally prefixed by a curve for ephemeral ECDH
# key exchanges.
# See OpenSSL documentation for details on how to create the
# DH parameter file. Supported curves for ECDH can be listed
# using the "openssl ecparam -list_curves" command.
# WARNING: EDH and EECDH ciphers will be silently disabled if
# this option is not set.
https_port 3128 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/usr/local/squid/etc/rootCA.crt key=/usr/local/squid/etc/rootCA.key options=SINGLE_DH_USE,SINGLE_ECDH_USE tls-dh=/usr/local/squid/etc/dhparam.pem
并重新启动 squid。
注意:请注意,这些配置片段可能无法在您的代理中正常工作。它们只是示例!
注意:在某些情况下,您可以在 tls-dh 选项中指定曲线。
tls-dh=prime256v1:/usr/local/squid/etc/dhparam.pem
⚠️ Disclaimer: Any example presented here is provided "as-is" with no support
or guarantee of suitability. If you have any further questions about
these examples please email the squid-users mailing list.
类别: ConfigExample
导航:站点搜索、站点页面、分类、🔼 向上