Security

有沒有辦法使用 Squid 將 https 請求記憶體或轉發到 http 代理?

  • September 21, 2018

我目前有 squid 設置來使用 MITM 的自簽名證書來記憶體 HTTPS 請求。這行得通。如果某個項目不在記憶體中,我想從像 Crawlera 這樣的線上代理請求。不幸的是,Crawlera 只提供一個 http 端點。當我嘗試轉發到這個端點時,一切都適用於 HTTP,但對於 HTTPS,我收到了錯誤:Handshake with SSL server failed: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol

我正在使用魷魚 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。

因此,事實證明我遇到的是 Squid 的一個已知問題。Squid 使用者郵件列表上的 Alex Rousskov 很好地幫助了我,並為我指明了 Measurement Factory 的 Squid 分支的方向。在那個叉子上是 Squid 的一個分支,它實際上可以處理ssl_bumpcache_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

據我所知,您應該簡單地將cache_peer 設置為 http(刪除ssl選項,順便說一下,如果您打算使用它,應該tlssquid 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 本身有關並且是一個錯字。

引用自:https://serverfault.com/questions/931811