Вопрос или проблема
На Ubuntu 16.04 у меня установлен Squid 3.5.12, собранный из исходников с следующим конфигом:
auth_param basic program /usr/lib/squid3/basic_ncsa_auth /etc/squid/squid-password
acl guests proxy_auth REQUIRED
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 443 # https
acl CONNECT method CONNECT
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
#http_access allow localhost
#http_access deny all
http_access allow guests
#http_port 3128
https_port 3129 connection-auth=off cert=/etc/letsencrypt/live/mywebsite.com/fullchain.pem key=/etc/letsencrypt/live/mywebsite.com/privkey.pem
coredump_dir /var/spool/squid
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern (Release|Packages(.gz)*)$ 0 20% 2880
refresh_pattern . 0 20% 4320
который работает через HTTPS. Я могу использовать мой прокси с браузером Google Chrome следующим образом:
"C:\Program Files\Google\Chrome\Application\chrome.exe" --proxy-server=https://mywebsite.com:3129
При переходе на Ubuntu 24.04, я установил squid с помощью следующей команды:
sudo apt install squid-openssl
и он начал работать с настройками по умолчанию через HTTP:
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/squid-password
acl guests proxy_auth REQUIRED
acl localnet src 0.0.0.1-0.255.255.255 # RFC 1122 "this" network (LAN)
acl localnet src 10.0.0.0/8 # RFC 1918 local private network (LAN)
acl localnet src 100.64.0.0/10 # RFC 6598 shared address space (CGN)
acl localnet src 169.254.0.0/16 # RFC 3927 link-local (directly plugged) machines
acl localnet src 172.16.0.0/12 # RFC 1918 local private network (LAN)
acl localnet src 192.168.0.0/16 # RFC 1918 local private network (LAN)
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 1025-65535 # unregistered ports
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
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localhost
http_access deny to_localhost
http_access deny to_linklocal
http_access allow guests
include /etc/squid/conf.d/*.conf
#http_access deny all
http_port 3128
coredump_dir /var/spool/squid
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern \/(Packages|Sources)(|\.bz2|\.gz|\.xz)$ 0 0% 0 refresh-ims
refresh_pattern \/Release(|\.gpg)$ 0 0% 0 refresh-ims
refresh_pattern \/InRelease$ 0 0% 0 refresh-ims
refresh_pattern \/(Translation-.*)(|\.bz2|\.gz|\.xz)$ 0 0% 0 refresh-ims
refresh_pattern . 0 20% 4320
Для HTTPS я добавляю следующее:
https_port 3129 tls-cert=/etc/letsencrypt/live/mywebsite.com/fullchain.pem tls-key=/etc/letsencrypt/live/mywebsite.com/privkey.pem generate-host-certificates=on dynamic_cert_mem_cache_size=4MB
sslcrtd_program /lib/squid/security_file_certgen -c -s /var/lib/squid/ssl_db -M 4MB
или
https_port 3129 connection-auth=off tls-cert=/etc/letsencrypt/live/mywebsite.com/fullchain.pem tls-key=/etc/letsencrypt/live/mywebsite.com/privkey.pem
но безуспешно.
Когда я попытался подключиться через HTTPS с помощью
"C:\Program Files\Google\Chrome\Application\chrome.exe" --proxy-server=mywebsite.com:3129
В логах появилась ошибка, что не удалось настроить TLS соединение:
2025/01/15 08:43:34 kid1| ERROR: failure while accepting a TLS connection on conn23 local=172.236.29.157:3129 remote=91.122.37.167:50191 FD 12 flags=1: SQUID_TLS_ERR_ACCEPT+TLS_LIB_ERR=A00009B+TLS_IO_ERR=1
connection: conn23 local=172.236.29.157:3129 remote=91.122.37.167:50191 FD 12 flags=1
2025/01/15 08:43:39 kid1| ERROR: failure while accepting a TLS connection on conn24 local=172.236.29.157:3129 remote=91.122.37.167:50281 FD 12 flags=1: SQUID_TLS_ERR_ACCEPT+TLS_LIB_ERR=A00009B+TLS_IO_ERR=1
connection: conn24 local=172.236.29.157:3129 remote=91.122.37.167:50281 FD 12 flags=1
2025/01/15 08:43:39 kid1| ERROR: failure while accepting a TLS connection on conn25 local=172.236.29.157:3129 remote=91.122.37.167:50282 FD 12 flags=1: SQUID_TLS_ERR_ACCEPT+TLS_LIB_ERR=A00009B+TLS_IO_ERR=1
connection: conn25 local=172.236.29.157:3129 remote=91.122.37.167:50282 FD 12 flags=1
и браузер Chrome не запрашивает учетные данные и показывает ошибку ERR_CONNECTION_RESET.
Что я сделал неправильно?
EDIT1
Мой HTTPS прокси работает с curl
:
curl -x https://mywebsite.com:3129 --proxy-user guest:<password> -L https://api.ipify.org/
но не работает с Google Chrome.
Почему предыдущая версия Squid 3.5.12 работала с Google Chrome, а версия 6.10 нет?
Google Chrome требует, чтобы прокси было указано со схемой (префикс https://
):
"C:\Program Files\Google\Chrome\Application\chrome.exe" --proxy-server=https://mywebsite.com:3129
Ответ или решение
Для решения проблемы с поддержкой HTTPS в Squid 6.10 на Ubuntu 24.04, следует учитывать несколько ключевых моментов, включая отличия в конфигурации Squid 3.5.12 и Squid 6.10, а также особенности работы различных версий браузера Google Chrome.
Теория
Настройка TLS в Squid: В версии Squid 6.10 произошло обновление подходов к конфигурации HTTPS подключений. Например, параметры tls-cert
и tls-key
используются вместо старых cert
и key
, также добавлена возможность генерации динамических сертификатов. Эти изменения требуют внимательного подхода к настройке.
Поведение браузеров: Современные браузеры, включая Google Chrome, изменили свои подходы к работе с прокси и безопасным соединением. Использование прокси может потребовать дополнительных настроек как на стороне клиента, так и на стороне сервера.
Пример
Рабочая конфигурация для Curl: Как указано в вашем примере, curl
успешно подключается к прокси, используя команду:
curl -x https://mywebsite.com:3129 --proxy-user guest:<password> -L https://api.ipify.org/
Это указывает, что прокси сервер Squid корректно обрабатывает запросы TLS от curl
.
Ошибка в Google Chrome: Ошибка ERR_CONNECTION_RESET в Google Chrome может указывать на проблемы с подлинностью сертификата, неподдерживаемыми версиями TLS или несоответствием шифров.
Применение
-
Проверка версии TLS и циклофоров: Убедитесь, что текущая конфигурация Squid использует современные версии TLS (например, TLS 1.3) и поддерживает поверхностные шифры, ожидаемые браузерами. Необходимо сверить поддержку на стороне сервера и клиента.
-
Проверка целостности сертификатов: Обновите сертификаты и проверьте их правильность, используя следующие команды:
openssl x509 -in /etc/letsencrypt/live/mywebsite.com/fullchain.pem -text -noout
Убедитесь, что ваш сертификат не просрочен и цепочка сертификации завершается надлежащим образом.
-
Логи Squid: Углубленная проверка логов Squid может выявить дополнительные детали о сбоях в соединении (например,
TLS_LIB_ERR=A00009B
). Используйте эти сообщения при настройке параметров и устранении ошибок. -
Конфигурация Squid: Используйте обновленные параметры конфигурации, как указано ниже:
https_port 3129 tls-cert=/etc/letsencrypt/live/mywebsite.com/fullchain.pem tls-key=/etc/letsencrypt/live/mywebsite.com/privkey.pem generate-host-certificates=on dynamic_cert_mem_cache_size=4MB sslcrtd_program /lib/squid/security_file_certgen -c -s /var/lib/squid/ssl_db -M 4MB
-
Настройка Google Chrome: Убедитесь, что запускаете Chrome с точной спецификацией схемы прокси:
"C:\Program Files\Google\Chrome\Application\chrome.exe" --proxy-server=https://mywebsite.com:3129
Применяя вышеуказанные рекомендации, вы можете устранить проблемы, связанные с настройкой HTTPS в Squid на Ubuntu 24.04, и успешно обеспечить безопасное подключение клиентов через Google Chrome. Проблемы в различиях работы между версиями Squid и поведения браузера могут быть решены через корректную настройку сертификатов, шифров и версий протокола на стороне сервера.