Показаны сообщения с ярлыком ssl. Показать все сообщения
Показаны сообщения с ярлыком ssl. Показать все сообщения

четверг, 28 января 2016 г.

SSL. Просто и понятно.

Генерируется сеансовый ключ для защищенного соединения. Это делается следующим образом:
— Клиент генерирует случайную цифровую последовательность
— Клиент шифрует ее открытым ключом сервера и посылает результат на сервер
— Сервер расшифровывает полученную последовательность при помощи закрытого ключа
Учитывая, что алгоритм шифрования является асимметричным, расшифровать последовательность может только сервер. При использовании асимметричного шифрования используется два ключа — приватный и публичный. Публичным отправляемое сообщение шифруется, а приватным расшифровывается. Расшифровать сообщение, имея публичный, ключ нельзя.
Отсюда - http://mnorin.com/tls-ssl-neobhodimy-j-minimum-znanij.html

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

SSL использует как асимметричную, так и симметричную криптографию.
Суть асимметричного шифрования заключается в том, что используется пара ключей. Один из них используется в качестве открытого (как правило, он публикуется в самом сертификате владельца), второй ключ называется секретным - он держится в тайне и никогда никому не открывается. Оба ключа работают в паре: один используется для запуска противоположных функций другого ключа. Если открытый ключ используется для того, чтобы зашифровать данные, то расшифровать их можно только секретным ключом.   
Любой пользователь может получить открытый ключ по назначению и использовать его для шифрования данных, расшифровать которые может только пользователь, владеющий секретным ключом.
 RSA - самый распространенный алгоритм шифрования с использованием асимметричных ключей.
 При шифровании симметричным ключом  используется один и тот же ключ для шифрованных данных. Если стороны хотят обменяться зашифрованными сообщениями в безопасном режиме, то у обеих сторон должны быть одинаковые симметричные ключи. Такой тип шифрования используется для большого объема данных. 
 Протокол SSL использует шифрование с открытым ключом для аутентификации клиент-сервер и наоборот, а также для определения ключа сессии, который, в свою очередь, используется более быстрыми алгоритмами симметричной криптографии для шифрования большого объема данных.
Отсюда - https://ru.wikipedia.org/wiki/SSL 

пятница, 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, но интересует без рута.