我目前已将 squid 设置为使用 MITM 的自签名证书来缓存 HTTPS 请求。这很有效。如果某个项目不在缓存中,我想从 Crawlera 等在线代理请求。不幸的是,Crawlera 仅提供 http 端点。当我尝试转发到此端点时,对于 HTTP 一切都正常,但对于 HTTPS,我收到错误:Handshake with SSL server failed: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
我使用的是 squid 4.2。有没有办法可以配置 squid,以便我可以将其指定为 https 请求的代理,然后让它充当缓存或转发到 HTTP 代理(支持 CONNECT)?如果我在某个时候以纯文本传输,那么对于此应用程序来说根本不重要。
以下是我对 Squid 的配置:
http_port 3128 ssl-bump \
cert=/apps/server_crt.pem key=/apps/server_key.pem \
generate-host-certificates=on dynamic_cert_mem_cache_size=4MB
sslcrtd_program /apps/squid/libexec/security_file_certgen -s /apps/squid/var/lib/ssl_db -M 4MB sslcrtd_children 8 startup=1 idle=1
acl step1 at_step SslBump1
ssl_bump peek step1
ssl_bump bump all
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src fc00::/7 # RFC 4193 local private network range
acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl Safe_ports port 1025-65535 # unregistered ports
acl CONNECT method CONNECT
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
coredump_dir /apps/squid/var/cache
maximum_object_size 10 GB
cache_dir ufs /apps/squid/var/cache/squid 100 16 256
cache_mem 256 MB
maximum_object_size_in_memory 512 KB
cache_replacement_policy heap LFUDA
range_offset_limit -1
quick_abort_min -1 KB
offline_mode on
http_access allow localnet
http_access allow localhost
http_access deny all
refresh_pattern . 525600 100% 525600 ignore-reload ignore-no-store ignore-private ignore-auth ignore-must-revalidate store-stale
cache_peer proxy.crawlera.com parent 8010 0 ssl login=APIKEY:
never_direct allow all
更新
如果我将上面的 ssl_bump 指令更改为以下内容:
acl step1 at_step SslBump1
acl step2 at_step SslBump2
acl step3 at_step SslBump3
ssl_bump stare step2
ssl_bump bump step3
对 HTTPS 资源的请求会一路通过两个代理到达目标,并正确地将响应返回给调用者,但它不再具有 Squid 代理的 MITM 访问权限来缓存结果,因此它们会在对同一资源的后续请求中连接到 Crawlera。另一方面,如果 HTTP 不在缓存中,它将通过两个代理,否则它会从缓存中返回。
但这仍然不是我想要的解决方案,我也想缓存 HTTPS。
答案1
据我所知,你应该简单地设置cache_peer 到 http(删除ssl
选项,顺便说一下,如果你打算使用它,应该是tls
因为鱿鱼 v4.x)
cache_peer proxy.crawlera.com parent 8010 0 ssl login=APIKEY
尝试:
cache_peer proxy.crawlera.com parent 8010 0 login=APIKEY
PS:我刚刚注意到:
在 APIKEY 之后那一行的末尾,我不确定这是否正确,您可能需要将其删除,除非它与 APIKEY 本身有关并且是打字错误。
答案2
因此,事实证明我遇到的问题是 Squid 的一个已知问题。Squid 用户邮件列表中的 Alex Rousskov 非常友善地帮助了我,并向我指出了由 Measurement Factory 创建的 Squid 分支。该分支上有一个 Squid 分支,可以真正解决与 相结合的ssl_bump
问题cache_peer
。https://github.com/measurement-factory/squid/tree/SQUID-360-peering-for-SslBump
我能够从这个分支进行构建,然后我原来的配置就可以起作用了!
我认为来自 Measurement Factory 分支的任何较新的分支都没有包含此修复。它也不是官方的 Squid 项目代码,因此 SP 不会支持它。但我听说 MF 正在努力将其包含在官方 SP 版本中,而且 MF 肯定有成功做到这一点的先例。
这是我的 Dockerized 端到端解决方案https://github.com/brett--anderson/squid_proxy