Squid Web Cache Wiki

Squid Web Cache 文档

🔗 使用 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。

:x: 如果您的证书被泄露,任何信任(知情或不知情)您的根证书的用户可能无法检测到他人策划的中间人攻击。

创建用于存储证书的目录(具体位置不重要)

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 中

  1. 打开“首选项”
  2. 转到“高级”部分,“加密”选项卡
  3. 按“查看证书”按钮,然后转到“证书颁发机构”选项卡
  4. 按“导入”按钮,选择之前创建的 .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

:information_source: 注意: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 的低权限账户需要读取和写入此目录的权限。

Squid-3.5:

/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

:warning: 低权限账户因操作系统而异,在您的系统中可能不是 ‘squid’。

:warning: 另外,请注意 SELinux 和 AppArmour 权限可能需要更新才能允许 Squid 助手使用此目录。

:warning: 仅当 squid 配置了 --enable-ssl-crtd 时才使用证书缓存目录。否则,bump 会工作,但不会将任何证书存储在任何地方。

🔗 故障排除

对于 Squid-3.1,在某些情况下,您可能需要在 Squid 配置中添加一些选项。

sslproxy_cert_error allow all
sslproxy_flags DONT_VERIFY_PEER

:warning: 警告! 这可以减少 cache.log 中的 SSL/TLS 错误,但不安全! 使用这些选项,您的缓存将忽略所有服务器证书错误,并允许用户连接它们。请自行承担使用这些选项的风险。

:information_source: 注意,DONT_VERIFY_PEER 即使是调试也不好。因为它很可能会隐藏您试图识别和修复的错误。

:information_source: 注意: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

:warning: SSL 选项必须用逗号(,)或冒号(:)分隔,而不是空格!

:information_source: NO_SSLv2 仅与 Squid-3.x 相关。SSLv2 支持已从 Squid-4 中完全移除。

因此,您可能会在 cache.log 中看到更多错误。因此,您必须单独调查每种情况并根据需要进行纠正。

🔗 加固

重要的是要提高您在嗅探连接中看不见的连接部分

默认情况下,您使用的是默认的密码套件集。并且从外部从未检查过您的 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_optionstls_outgoing_options,您可以提高出站 TLS 连接的安全性。

一个好的结果应该看起来像这样

Test TLS after change cipher's suite

这看起来对出站 SSL 连接更好。

:information_source: 注意:您的浏览器显示了从代理到客户端的连接安全信息。但您了解从代理到服务器的连接安全性很重要。别忘了密码套件。

:information_source: 注意:某些 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

:information_source: 注意:密码套件的使用也取决于您的 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

:information_source: 注意:别忘了,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。

:information_source: 注意:请注意,这些配置片段可能无法在您的代理中正常工作。它们只是示例!

:information_source: 注意:在某些情况下,您可以在 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

导航:站点搜索站点页面分类🔼 向上