пятница, 21 августа 2015 г.

Squid transparent HTTPS Proxy

Сейчас на рынке много платных продуктов, которые предлагают раскрывать SSL трафик и фильтровать запросы пользователей. Когда-то я занимался freeware решениями на linux. Тогда в squid не было возможности на лету раскрыть SSL, сейчас есть. В интернетах много статей на эту тему, но не нашел такой, после которой все заработало бы без шаманств.

1. Соберем squid

Посмотрите последнюю версию сквида.
wget http://www.squid-cache.org/Versions/v3/3.2/squid-3.2.7.tar.gz
tar -zxf squid-3.2.7.tar.gz
cd squid-3.2.7
./configure --prefix=/opt/squid --enable-ssl --enable-ssl-crtd --with-openssl

make all
make install

2. Создадим сертификат

openssl genrsa -out privkey.pem 1024
openssl req -new -key privkey.pem -out certreq.csr
openssl x509 -req -days 3650 -in certreq.csr -signkey privkey.pem -out squid.pem

3. Подготовим кэширование сертификатов

mkdir /opt/squid/var/lib
/opt/squid/libexec/ssl_crtd -c -s /opt/squid/var/lib/ssl_db
chown -R nobody /opt/squid/var/lib/ssl_db

Если меняется сертификат сервера, нужно грохнуть /opt/squid/var/lib/ssl_db, после чего запустить по новой процедуру подготовки кэширования.

4. Добавим в конфиг сквида

http_port 3130
http_port 3128 intercept
https_port 3129 intercept ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/opt/squid/etc/squid.pem key=/opt/squid/etc/privkey.pem cipher=TLSv1:!AES128:!CAMELLIA

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

Забегая вперед скажу, что заработало все, когда я закоментил строку "ssl_bump client-first all" и добавил "cipher=TLSv1:!AES128:!CAMELLIA". После этого в динамических сертификатах появилась строка с доменным именем хоста. До этого при динамическом перехвате трафика и отправки его в проксю, гмаил ругался на mitm атаку (NET::ERR_CERT_COMMON_NAME_INVALID).

5. Запустить squid
/opt/squid/sbin/squid -z 
/opt/squid/sbin/squid

Клиенту я добавил сертификат squid.pem в доверенные корневые центры сертификации.
Во многих статьях (всех, которые мне попались) для клиента генерят сертификат так:

openssl x509 -in squid.pem -outform DER -out squid.der

У меня и Firefox и IE и, соответственно, Chrome отказались есть .der

На squid я отправляю трафик микротиком, указывая его в качестве шлюза для пакетов с определенными метками (их микротик ставит в таблице mangle). На линуксовой машине в нужные порты распихивает iptables:

-A PREROUTING -i tun0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 127.0.0.1:3128
-A PREROUTING -i tun0 -p tcp -m tcp --dport 443 -j DNAT --to-destination 127.0.0.1:3129

---
Использовал выдержки и инфу их статей:
http://habrahabr.ru/post/168515/
https://toster.ru/q/43184

Очень помог этот тред - http://www.linux.org.ru/forum/admin/11419750

Пока что не получается импортировать сертификать в смартфон Nexus 5 с ОС Android 5.1.1. Процедура проходит без ошибок ()http://android.stackexchange.com/questions/61540/self-signed-certificate-install-claims-success-but-android-acts-as-if-cert-isn, но в результате во вкладке "пользовательские сертификаты" нет импортируемого сертификата. Рута нет. Если кто победит, прошу поделиться. Тут точное описание проблемы с импортом сертификата - http://android.stackexchange.com/questions/61540/self-signed-certificate-install-claims-success-but-android-acts-as-if-cert-isn

Вот описан способ с рутом - http://wiki.cacert.org/FAQ/ImportRootCert, но интересует без рута.