有沒有辦法使用 Squid 將 https 請求記憶體或轉發到 http 代理?
我目前有 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_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
據我所知,您應該簡單地將cache_peer 設置為 http(刪除
ssl
選項,順便說一下,如果您打算使用它,應該tls
從squid 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 本身有關並且是一個錯字。