Назад | Перейти на главную страницу

Есть ли способ кэшировать или пересылать https-запросы на http-прокси с помощью Squid?

В настоящее время у меня есть настройка 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 проходит через оба прокси-сервера к цели и правильно возвращает ответ вызывающему, но у него больше нет доступа MITM на прокси-сервере Squid для кэширования результатов, поэтому они ПОДКЛЮЧАЮТСЯ к Crawlera при последующих запросах для тот же ресурс. HTTP, с другой стороны, будет проходить через оба прокси, если его нет в кеше, в противном случае он будет возвращен из кеша.

Это все еще не то решение, которое я ищу, я также хотел бы кешировать HTTPS.

Насколько я могу судить, вам нужно просто установить 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 и не является опечаткой.

Итак, оказалось, что я столкнулся с известной проблемой Squid. Алекс Руссков из списка рассылки Squid Users был достаточно любезен, чтобы помочь мне и указать мне направление форка Squid от Measurement Factory. На этой вилке есть ветка 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