LINUX.ORG.RU
ФорумAdmin

Squid3.4 + ssl_bump. Ошибка сертификата, Доступ запрещён

 , ,


1

3

Выражаю благодарность двум формучанам blind_oracle и leg0las,читая топики которых, я немного разобрался в теме.
Тем не менее, безуспешно бьюсь над этим вопросом, в котором прощу помощи:
HTTP работает нормально, а при попытке, например, зайти на Гугл, пишет «Ошибка сертификата» ---> «Доступ запрещён»..
ОС: Debian 7.8
В Debian стоит старая версия squid, у которой есть трудности с https. Ставить новую версию из исходников не хотелось, поэтому, временно подключив тестовый репозиторий, качнул оттуда библиотеки и исходники squid3.4.8 для создания .deb-пакета.
Если кому интересно - подробности:

apt-get install libecap2-dev libnetfilter-conntrack-dev nettle-dev
...
cd /usr/src
apt-get source squid3

Отрубил тестовый репозиторий.
Делаю squid. Ставлю пакеты для сборки (из обычного репозитория):

apti-get install dpkg-dev squid-langpack devscripts build-essential fakeroot
Стандартные шаги по сборке:
apt-get  build-dep squid3
apt-get  build-dep openssh
apt-get  build-dep openssl
Дабавки:
nano debian/rules
--enable-ssl \
--enable-ssl-crtd \
--with-openssl \
Ещё добавки:
nano src/ssl/certificate_db.cc
#include <unistd.h>
Собрал и установил:
./configure
...
debuild -us -uc -b
...
cd ..
dpkg -i squid3_3.4.8-6_i386.deb squid3-common_3.4.8-6_all.deb squid3-dbg_3.4.8-6_i386.deb squid-cgi_3.4.8-6_i386.deb squidclient_3.4.8-6_i386.deb squid-purge_3.4.8-6_i386.deb
Squid собран с поддержкой SSL:
squid3 -v
Squid Cache: Version 3.4.8
Debian linux
configure options:  '--build=i486-linux-gnu' '--prefix=/usr' '--includedir=${prefix}/include' '--mandir=${prefix}/share/man' '--infodir=${prefix}/share/info' '--sysconfdir=/etc' '--localstatedir=/var' '--libexecdir=${prefix}/lib/squid3' '--srcdir=.' '--disable-maintainer-mode' '--disable-dependency-tracking' '--disable-silent-rules' '--datadir=/usr/share/squid3' '--sysconfdir=/etc/squid3' '--mandir=/usr/share/man' '--enable-inline' '--disable-arch-native' '--enable-async-io=8' '--enable-storeio=ufs,aufs,diskd,rock' '--enable-removal-policies=lru,heap' '--enable-delay-pools' '--enable-cache-digests' '--enable-icap-client' '--enable-follow-x-forwarded-for' '--enable-auth-basic=DB,fake,getpwnam,LDAP,MSNT,MSNT-multi-domain,NCSA,NIS,PAM,POP3,RADIUS,SASL,SMB' '--enable-auth-digest=file,LDAP' '--enable-auth-negotiate=kerberos,wrapper' '--enable-auth-ntlm=fake,smb_lm' '--enable-external-acl-helpers=file_userip,kerberos_ldap_group,LDAP_group,session,SQL_session,unix_group,wbinfo_group' '--enable-url-rewrite-helpers=fake' '--enable-eui' '--enable-esi' '--enable-icmp' '--enable-zph-qos' '--enable-ecap' '--enable-ssl' '--enable-ssl-crtd' '--disable-translation' '--with-swapdir=/var/spool/squid3' '--with-logdir=/var/log/squid3' '--with-pidfile=/var/run/squid3.pid' '--with-filedescriptors=65536' '--with-large-files' '--with-openssl' '--with-default-user=proxy' '--enable-build-info=Debian linux' '--enable-linux-netfilter' 'build_alias=i486-linux-gnu' 'CFLAGS=-g -O2 -fPIE -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wall' 'LDFLAGS=-fPIE -pie -Wl,-z,relro -Wl,-z,now' 'CPPFLAGS=-D_FORTIFY_SOURCE=2' 'CXXFLAGS=-g -O2 -fPIE -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security'
Сделал сертификаты:
mkdir /etc/squid3/ssl && cd /etc/squid3/ssl
openssl req -new -newkey rsa:1024 -days 365 -nodes -x509 -keyout squid.pem -out squid.pem
openssl x509 -in squid.pem -outform DER -out squid.der
rm -rf /var/lib/ssl_db && /usr/lib/squid3/ssl_crtd -c -s /var/lib/ssl_db && chown -R proxy:proxy /var/lib/ssl_db
В squid прописал настройки для HTTPS:
http_port 3128
http_port 3129 intercept
https_port 3130 intercept ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/squid3/ssl/squid.pem key=/etc/squid3/ssl/squid.pem
sslproxy_flags DONT_VERIFY_PEER
sslproxy_cert_error allow all
always_direct allow all
ssl_bump client-first all
ssl_bump server-first all
ssl_bump none all
sslcrtd_program /usr/lib/squid3/ssl_crtd -s /var/lib/ssl_db -M 4MB
Отключил IPv6, включил маршрутизацию и завёл всех на squid:
$IPT -t nat -A PREROUTING -i $LAN -p TCP --source $LAN_NET --dport 80 -j DNAT --to-destination $LAN_IP:3129
$IPT -t nat -A PREROUTING -i $LAN -p TCP --source $LAN_NET --dport 443 -j DNAT --to-destination $LAN_IP:3130
На клиенты добавил сгенерированный сертификат squid.der. В итоге HTTP работает нормально, а при попытке, например, зайти на Гугл, пишет «Ошибка сертификата» ---> «Доступ запрещён».



Последнее исправление: Alpha789 (всего исправлений: 3)
Ответ на: комментарий от Alpha789

Удаление цепочки: iptables -X to_squid -t nat
Или всех юзерских: iptables -X -t nat
Цепочки предварительно должны быть опустошены.

Что ее сохраняет при перезагрузке, это в стартовых скриптах стоит смотреть

Kuzz ★★★
()
Ответ на: комментарий от Kuzz

С руганью iptables решил вопрос добавлением ещё одно правила очищения «$IPT -t nat -X»:

$IPT -F
$IPT -t nat -F
$IPT -t mangle -F
$IPT -t nat -X
$IPT -X
В итоге имею это:
$IPT -t nat -N to_squid
$IPT -t nat -A PREROUTING -p tcp --dport 80 -j to_squid
for a in $(host -t a gmail.com | awk '/has address/ {print $4;}'); do
$IPT -t nat -A to_squid -j RETURN
done
$IPT -t nat -A to_squid -p tcp -j REDIRECT --to-port 3128
Но при этом проксирование не работает совсем: никакие сайты не открываются, а в логах squid пусто. В том числе, когда поправляю предпоследнюю строчку так:
$IPT -t nat -A to_squid -d ${a} -j RETURN
На squid всех заворачиваю так:
$IPT -t nat -A PREROUTING -i $LAN -p TCP --source $LAN_NET --dport 80 -j DNAT --to-destination $LAN_IP:3129
$IPT -t nat -A PREROUTING -i $LAN -p TCP --source $LAN_NET --dport 443 -j DNAT --to-destination $LAN_IP:3130

Alpha789
() автор топика
Ответ на: комментарий от Alpha789

Эта строчка $IPT -t nat -A to_squid -p tcp -j REDIRECT --to-port 3128 тоже делает редирект.
И срабатывает, похоже, раньше.

Тогда все это:

$IPT -t nat -N to_squid
$IPT -t nat -A PREROUTING -p tcp --dport 80 -j to_squid
$IPT -t nat -A PREROUTING -p tcp --dport 443 -j to_squid
for a in $(host -t a gmail.com | awk '/has address/ {print $4;}'); do
$IPT -t nat -A to_squid -в ${a} -j RETURN
done
$IPT -t nat -A to_squid -p tcp -j REDIRECT --to-port 3129
$IPT -t nat -A to_squid -p tcp -j REDIRECT --to-port 3130

Kuzz ★★★
()
Последнее исправление: Kuzz (всего исправлений: 1)
Ответ на: комментарий от Kuzz

Kuzz, до меня наконец-то дошло не без сторонней помощи, что если опираться на эти правила:

$IPT -t nat -N to_squid
$IPT -t nat -A PREROUTING -p tcp --dport 80 -j to_squid
$IPT -t nat -A PREROUTING -p tcp --dport 443 -j to_squid
for a in $(host -t a gmail.com | awk '/has address/ {print $4;}'); do
$IPT -t nat -A to_squid -d ${a} -j RETURN
done
$IPT -t nat -A to_squid -p tcp -j REDIRECT --to-port 3129
$IPT -t nat -A to_squid -p tcp -j REDIRECT --to-port 3130
То в них главной проблемой является вывод:
host -t a gmail.com
gmail.com has address 173.194.71.83
gmail.com has address 173.194.71.19
gmail.com has address 173.194.71.17
gmail.com has address 173.194.71.18
Что по сути делает эти правила следующими:
$IPT -t nat -N to_squid
$IPT -t nat -A PREROUTING -i $LAN -s $LAN_NET -p tcp --dport 80 -j to_squid
$IPT -t nat -A PREROUTING -i $LAN -s $LAN_NET -p tcp --dport 443 -j to_squid
$IPT -t nat -A to_squid -d 173.194.71.18 -j RETURN
$IPT -t nat -A to_squid -d 173.194.71.17 -j RETURN
$IPT -t nat -A to_squid -d 173.194.71.83 -j RETURN
$IPT -t nat -A to_squid -d 173.194.71.19 -j RETURN
$IPT -t nat -A to_squid -p tcp --dport 80 -j REDIRECT --to-port 3129
$IPT -t nat -A to_squid -p tcp --dport 443 -j REDIRECT --to-port 3130
А поскольку при обращении к gmail.com идут редиректы на mail.google.com, accounts.google.com, подгрузка контента с других гугловских сайтов и неизвестно что еще, то и их все тоже надо прописывать в исключения.

А такая затея выглядит сложнее, чем подрудить gmail.com со squid. Так что буду заниматься этой «дружбой». Напишу, если что получится.

Благодарю за помощь!

Alpha789
() автор топика
Ответ на: комментарий от Alpha789

Проблема как раз таки только в gmail.com, котоый редиректит на mail.google.com.
Остальные сайты имеют нормальные сертификаты.

Пожалуйста)

Kuzz ★★★
()
Ответ на: комментарий от Kuzz

Собрал повторно deb-пакет squid3.4.8 с упомянутым патчем, потихоньку разбираюсь.

Kuzz, у Тебя очень интересный файл https.conf

https_port 8443 key=/etc/squid/ssl/squid.pem cert=/etc/squid/ssl/squid.cer generate-host-certificates=on dynamic_cert_mem_cache_size=16MB options=ALL dhparams=/etc/squid/ssl/squid.dhp version=4 cipher=TLSv1:!AES128:!CAMELLIA

https_port 3130 intercept ssl-bump key=/etc/squid/ssl/squid.pem cert=/etc/squid/ssl/squid.cer generate-host-certificates=on dynamic_cert_mem_cache_size=16MB options=ALL dhparams=/etc/squid/ssl/squid.dhp version=4 cipher=TLSv1:!AES128:!CAMELLIA

# the following two options are unsafe and not always necessary:
acl mism_cert dstdomain -i "/etc/squid/lists/mism_ssl"
acl redir dstdomain gmail.com
acl redir dstdomain www.gmail.com
acl noredir dstdomain mail.google.com
acl noredir2 url_regex mail\.google\.com
sslproxy_cert_error allow mism_cert
sslproxy_cert_adapt setCommonName{*.gmail.com} redir !noredir2 !noredir
sslproxy_cert_adapt setCommonName ssl::certDomainMismatch !redir
#sslproxy_flags DONT_VERIFY_PEER
sslcrtd_program /usr/lib/squid/ssl_crtd -s /var/lib/squid/ssl_db -M 16MB
sslcrtd_children 16
Скажи, пожалуйста, как Ты делал сертификаты squid.pem, squid.cer, squid.dhp? Может некоторые особые настройки openssl?

И так, чисто из любопытства: зачем Тебе ещё один https_port 8443?

Alpha789
() автор топика
Ответ на: комментарий от Alpha789

Сейчас сертификат выдан центром сертификации виндовой AD. Но и на самоподписанном, сгенеренном openssl все работало. Просто AD распространяет доверие по домену и импортировать приходится только в firefox в opera.

squid.dhp - openssl dhparam -out squid.dhp 2048

Не «intercept» порт остался «для совместимости»)) На него были настроены какие то проги.

Ну и видны «игры» с gmail.com, хоть в рабочей конфигурации у меня этой части нет.

Касательно воркеров - по умолчанию в таком режиме squid создает сокеты управления в /var/run/squid/. Если каталог не существует, то в лог он может ничего не писать, но работать не будет.

Kuzz ★★★
()
Последнее исправление: Kuzz (всего исправлений: 1)
Ответ на: комментарий от Kuzz

Прошу прощения, а можно более детально описать ниже описанные параметры комнфигурации squid, чтобы в будущем возможно было обойти другие подобные проблемы с другими доменами, а не только с гуглом? Скажем так, описать для чайников.

sslproxy_cert_error allow mism_cert
sslproxy_cert_adapt setCommonName{*.gmail.com} redir !noredir2 !noredir
sslproxy_cert_adapt setCommonName ssl::certDomainMismatch !redir

dmnord
()
Ответ на: комментарий от dmnord

Эта конструкция нормально не работает. Возможно в 3.5 получится, но я пока что не пробовал.

Проблема в том, что http://www.gmail.com и mail.google.com это один и тот сервер. Сертификат там на mail.google.com.

Т.к. браузер сам резолвит имя, то сквид вначале получает только айпишник (потому и срабатывают правила с 'dst'), а чтоб получить от браузера запрос, нужно уже отдавать сертификат.
В результате, с gmail.com, yadi.sk (такая же проблема) траблы.
Собственно, в доках и написано о такой ситуации (ворнинг) http://www.squid-cache.org/Doc/config/sslproxy_cert_adapt/

'sslproxy_cert_error allow mism_cert' - разрешает ошибки в сертификатах для acl mism_cert
sslproxy_cert_adapt setCommonName{*.gmail.com} - в генерируемом сертификате пропишет то, что в {}
sslproxy_cert_adapt setCommonName ssl::certDomainMismatch - пропишет то, что сам сквид считает правильным. В качестве acl проверяется наличие именно этой ошибки.

Kuzz ★★★
()
Последнее исправление: Kuzz (всего исправлений: 2)
17 октября 2015 г.
Ответ на: комментарий от Alpha789

Фильтрация исполняемых файлов

На сколько я понял статья выше позволяет блокировать доступ к домену по HTTPS целиком, фильтровать контент на странице не получится ?

Lexus34
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.