- Что такое stunnel
- Включение и отключение поддержки криптопро csp браузером
- Выбор ос
- Конфигурация
- Конфигурирование stunnel
- Криптотуннель по госту
- Пара слов об openvpn
- Подготовительный шаг
- Подготовка
- Подготовка и первичная настройка
- Поддержка протоколов tls по госту
- Принцип работы
- Провайдер vps
- Сайты, запрашивающие шифрование гост tls
- Твой тайный туннель. детальный гайд по настройке openvpn и stunnel для создания защищенного канала
- Установка «криптопро csp»
- Формирование xmldsig
- Через командную строку
- Шифрование tls-трафика по алгоритмам гост-2022 c stunnel
- Экономим бюджет компании, или как построить гостовский крипто-туннель с минимальными затратами
Что такое stunnel
Stunnel — это утилита для обеспечения защищенного соединения между клиентом и сервером посредством TLS для программ, которые сами шифровать трафик не умеют. Например, можно туннелировать трафик для netcat , vnc и даже bash . В нашем случае stunnel будет использоваться для маскировки трафика OpenVPN под «чистый» TLS, чтобы его было невозможно определить посредством DPI и, следовательно, заблокировать.
Включение и отключение поддержки криптопро csp браузером
По умолчанию в браузере включена поддержка КриптоПро CSP. Рекомендуем убедиться в этом:
Чтобы отключить поддержку шифрования, воспользуйтесь аналогичной последовательностью действий.
Источник
Выбор ос
Я буду использовать RHEL 7.4. Для точного копирования команд из статьи годится и CentOS 7 (1708), так как это бесплатная и почти идентичная копия RHEL, основанная на его коде. Возможно, подойдут другие дистрибутивы, а также производные RHEL (Fedora), но пути конфигурационных файлов и версии программ могут отличаться.
Конфигурация
Конфигурация stunnel-msspi аналогична конфигурации stunnel , но обладает некоторыми особенностями:
Конфигурирование stunnel
Осталось только правильно настроить наш туннель. Для этого создадим файл stunnel.conf с настройками Stunnel по умолчанию и напишем туда следующее:
Теперь, если всё сделано правильно, можно запустить Stunnel с нашей конфигурацией и подключиться к серверу:
Откроем браузер и зайдём по адресу localhost:8080. Если всё верно, то отобразится следующее:
Если же нет, то смотрим логи и используем отладчик, чтобы понять в чём же всё-таки проблема.
Источник
Криптотуннель по госту
Туннель поднимается с помощью
, который работает в режиме прокси. Нужно только научить его использовать модуль gost. Но тут есть момент — чтобы модуль инициализировался правильно, нужно слегка исправить исходники. Проблема, как я понял, связана с порядком инициализации модуля и методов. Итак:
Пара слов об openvpn
OpenVPN использует два канала: канал управления (control channel) и канал данных (data channel). В первом случае задействуется TLS — с его помощью ведется аутентификация и обмен ключами для симметричного шифрования. Эти ключи используются в канале данных, где и происходит само шифрование трафика.
Существуют скрипты, которые автоматизируют установку, и процесс занимает меньше времени. Но, во-первых, эти скрипты подходят только для конкретных дистрибутивов, а во-вторых, они не предоставляют выбора. Например, используют RSA и AES-CBC, когда есть поддержка ECDSA и AES-GCM.
Подготовительный шаг
- OpenSSL
- Stunnel
- rtengine
- Доступ к тестовым серверам КриптоПро, для проверки соединения по TLS
OpenSSL для Windows можно взять отсюда, а для пользователей линукса — из репозиториев или собрать самому, скачав свежую версию отсюда. Также его можно взять из Rutoken SDK, из директории opensslopenssl-tool-1.1, этот архив нам будет полезен и дальше, т.к. в нём находится интересующий нас rtengine. Stunnel можно найти здесь. Для работы необходима версия >= 5.56.
Подготовка
Взаимодействие состоит из следующих частей:
Для работы используется сервер CentOS 6, Python 2.7.11, OpenSSL GOST engine, stunnel. Краткая инструкция установки openssl с поддержкой ГОСТ
Думаю, ничего сложного быть не должно и всё уже сотни раз описано. А в более свежих дистрибутивах модуль
gost
есть из коробки.
OpenSSL используется двояко: с ним собран stunnel, что-бы работал по ГОСТу; и утилита openssl вызывается из кода python-а для формирования и проверки подписей. Вызов openssl обусловлен тем, что не удалось из кода python-на задавать используемый крипто-модуль. Всё необходимое ПО есть как на Linux, так и на Windows платформах, потому методику можно назвать мультиплатформенной.
Для python-а сервера CentOS 6 нужно будет обновить библиотеку lxml, а для этого поставить несколько дополнительных пакетов:
# yum install libxml2 libxml2-devel libxslt libxslt-devel python-devel
# pip install lxml --upgrade
Так же нам потребуются файлы сертификата и закрытого ключа в формате PKCS12 (.pem). Получить их из eToken-а можно с помощью утилит вроде P12FromGostCSP или вручную. Если сделать это по каким-либо причинам не получается, то есть вариант работы с ключом «Рутокен ЭЦП» напрямую.
Подготовка и первичная настройка
После покупки сервера и установки системы нам нужно попасть на сервер. Я буду делать это с помощью SSH. Вся конфигурация будет проходить в два этапа: настройка на сервере (включает в себя первичную настройку) и настройка клиентов.
Поддержка протоколов tls по госту
Яндекс.Браузер использует протоколы TLS, которые обеспечивают защищенную передачу данных в интернете. Передаваемые по безопасному соединению данные шифруются и расшифровываются с использованием утилиты КриптоПро CSP.
Принцип работы
Оригинальная реализация stunnel при установке защищённых TLS-соединений использует библиотеку OpenSSL, которая ограниченно поддерживает криптографические алгоритмы ГОСТ. Для обеспечения работы ГОСТ-алгоритмов в полном объёме в stunnel-msspi используется интерфейс msspi , который поддерживает ГОСТ-алгоритмы, используя установленный в систему криптопровайдер.
Провайдер vps
Первым делом нужно выбрать провайдера, который нам предоставит виртуальный выделенный сервер (VPS). Что выбирать — дело каждого и зависит от страны и от того, сколько ты готов платить. Главная рекомендация — выбирай страну, наиболее близкую по географическому расположению, это сведет задержку к минимуму. Но, конечно, живя в Китае, покупать сервис в Индии или Пакистане смысла мало.
Сайты, запрашивающие шифрование гост tls
Если сайт запрашивает шифрование ГОСТ TLS, браузер проверяет, установлено ли программа КриптоПро CSP. Если программа установлена, ей передается управление.
Твой тайный туннель. детальный гайд по настройке openvpn и stunnel для создания защищенного канала
Существует бесчисленное множество сервисов, которые предоставляют VPN, в том числе и бесплатные. Вот несколько причин, почему бесплатный VPN — это плохая идея.
- Качество. Те, кто пользовался бесплатным VPN, знают, что в большинстве случаев сервис просто ужасен: низкая скорость, постоянные обрывы. Это и неудивительно, ведь, кроме тебя, им одновременно может пользоваться еще пара сотен человек.
- Безопасность. Даже если качество более-менее сносное, ты не знаешь, что на самом деле происходит с твоим трафиком. Хранится и анализируется ли он, кто и в каких целях оперирует сервисом. Бесплатный сыр, как говорится.
- Малое количество или полное отсутствие опций и настроек: нет возможности выбрать шифр, протокол и порт. Остается только пользоваться тем, что дали.
С платными сервисами дела обстоят лучше: можно ожидать какого-то гарантированного качества и наличия настроек. Но ты все еще не можешь знать наверняка, хранятся твои логи непосредственно на сервере или нет. К тому же твоего провайдера могут заблокировать.
Установка «криптопро csp»
По требованиям российского законодательства признается только использование TLS-соединений, установленных по российским криптографическим алгоритмам ГОСТ 28147-89, ГОСТ Р 34.10-94, ГОСТ Р 34.11-94 и ГОСТ Р 34.10-2001. Поэтому, если вам требуется использование сайтов, использующих шифрование по ГОСТ алгоритмам, необходимо установить программу «КриптоПро CSP» .
В операционных системах Windows используется программа КриптоПро CSP — набор криптографических утилит для генерации электронной подписи, работы с сертификатами
Для установки КриптоПро CSP воспользуйтесь материалами с официального сайта:
После установки КриптоПро CSP браузер проверяет наличие и работоспособность этой программы.
Формирование xmldsig
Когда туннель до сервера ГИС ЖКХ настроен и работает, можно слать туда всякие запросы и получать нужные ответы. Запрос отправляется в виде XMLDSig, в котором содержится сам запрос, хеш этого запроса, хеш сертификата, сам сертификат, подпись хеша запроса с хешем сертификата и куча полей, всё это описывающих.
Алгоритм формирования XMLDSig можно реализовать используя любой удобный язык программирования. Мы использовали python 2.7.11, демонстрационный код прилагается. Как пример, буду так же приводить консольный аналог.
0. Из сертификата достаются серийный номер и данные о выпустившем, генерируются необходимые id и запоминается текущее время.1. С помощью любого soap клиента (например, suds на Python) формируется SOAP-запрос к серверу ГИС ЖКХ.
2. Берётся содержимое тега <ns1:Body>(точнее часть с Id и без первого и последнего символа перевода строки), канонизируется алгоритмом C14N (exclusive=True), считается от неё хеш-сумма по ГОСТу и выводится в виде BASE64. Получаем digest1. Консольный аналог:
Через командную строку
Для того, чтобы получить корневой сертификат, зайдём на сайт тестового УЦ ООО «КРИПТО-ПРО». И нажмём на кнопку для получения сертификата. Отобразится новая вкладка, в которой нужно будет выбрать метод шифрования Base64 и нажать на кнопку «Загрузка сертификата ЦС». Полученный файл certnew.cer сохраняем.
Теперь генерируем ключи.
Стоит заметить, что сгенерированные на токене ключи не могут быть скопированы с токена. В этом состоит одно из основных преимуществ их использования.
Создадим запрос на сертификат:
Шифрование tls-трафика по алгоритмам гост-2022 c stunnel
В этой статье я хочу показать, как настроить Stunnel на использование российских криптографических алгоритмов в протоколе TLS. В качестве бонуса покажу, как шифровать TLS-канал, используя алгоритмы ГОСТ, реализованные в криптоядре Рутокен ЭЦП 2.0.
Но для начала давайте вообще разберёмся для чего нужен Stunnel. В двух словах — это программа, на которую можно переложить всю логику шифрования трафика между сервером и клиентом. Делается это следующем образом: допустим у вас есть клиент и сервер, которые общаются между собой без использования шифрования, аутентификации и проверки целостности.
Вы могли бы переписать клиент и сервер так, чтобы все исходящие и входящие сообщения передавались между собой с учётом всех этих моментов, но для чего такие сложности, если можно это просто переложить на плечи другому приложения? Для решения такой задачи как раз подойдёт Stunnel.
Вам нужно просто настроить клиент таким образом, чтобы весь свой трафик он передавал на клиентский Stunnel, в свою очередь, он устанавливает безопасное соединение с сервером, отправляя данные на серверный Stunnel. Stunnel на сервере расшифровывает пришедший трафик и перенаправляет данные на вход серверу. Вышесказанное проще осознать глядя на эту диаграмму
Стоит заметить, что на сервере не обязательно должен стоять именно Stunnel, для работы с криптографическими алгоритмами. Здорово, что есть готовые демонстрационные стенды, которые поддерживают российскую криптографию, список которых есть в презентации с РусКрипто’2022.
Нам нужны стабильно работающие серверы, осуществляющие двухстороннюю аутентификацию. Мы выбрали серверы КриптоПро как наиболее надёжные с полной реализацией стандарта ГОСТ TLS. Спасибо им за это 🙂
Звучит достаточно просто, давайте попробуем организовать этот процесс.
Экономим бюджет компании, или как построить гостовский крипто-туннель с минимальными затратами
Автор статьи: Роман Вегелин
Содержание
1. Введение
2. Задача
3. В бой
a. Linux
b. Windows
Для любого системного администратора или DevOps’а построить VPN или пробросить нестандартный метод инкапсуляции пакетов (туннелирование) не очень сложно. Часто для этого используют OpenVPN для постоянного использования, либо ssh-туннелирование на один-два раза. Однако есть организации, которые должны соблюдать строгие рамки передачи данных, установленные законодательством. Под такие организации попадают банки, микрофинансовые организации (да и многие организации, которые так или иначе имеют отношения к финансовым операциям). Защита персональных данных тоже является “защищаемой информацией” во всех законопроектах и положениях.
В результате, опять же по законодательству, при шифровании необходимо использовать СКЗИ со всеми необходимыми ФСТЕКовскими сертификатами и лицензиями, которые удовлетворяют необходимые требования. Одним из таких программных обеспечений является КриптоПро CSP. И в данной статье будем разбирать как “прокинуть” сетевой туннель средствами stunnel, который будет шифроваться КриптоПро CSP, заодно получим хоть и тестовый (на 3 месяца), но полностью валидный по GOST_2022.
Задача
Для начала необходимо разбираться как эта все будет работать и поставить конкретные задачу.
К примеру, есть две машины. Чтобы показать настройку двух операционных систем, одна будет на Linux Ununtu, версия не важна, но желательно не ниже 16), вторая на Windows 10. На win-системе будет запускаться NC на прослушку какого-то определенного порта, а с nix-системы будут передаваться пакеты. Таким образом windows будет сервером. В отношении настроек stunnel такая же ранжировка: Windows — сервер.
Что должно получиться в итоге получить? При подключении с Linux к Windows программой NC, все пакеты будут шифроваться сертификатом GOST_2022, и сертифицированным программным обеспечением. Задача тривиальная, чтобы показать возможность такого маневра. Так, как stunnel передает любой протокол внутри себя, можно, к примеру, подписывать XML-файлы секретной подписью другой организации, или передавать перс. данные в хранилище через интернет.
В бой
#Linux
Начнем с того, что система готова к настройке. Как работает КриптоПро скорее всего все уже знают. Небольшие уточнения по stunnel: этот софт изначально предназначался как прокси с функцией шифрования трафика. Другими словами — он берет, к примеру, http и превращает его в, своего рода, https (если не вдаваться в подробности протоколирования).
Работает stunnel следующим образом — при запуске на локальной машине открывается определенный, указанный в конфигурационном файле порт. И в тот же момент, софт соединяется с stunnel на другой машине. Таким образом, все пакеты, попавшие на порт localhost шифруются, затем проксируются на другую систему и там расшифровываются. Удобство в том, что это просто шлюз, и какой протокол ему шифровать и передавать — не важно.
Рисунок 1. Схема работы stunnel
Изначально скачиваем необходимый КриптоПро отсюда. В скаченном архиве будет примерно такой набор файлов, как на скриншоте.
Рисунок 2. КриптоПро на Linux.
Для установки необходимо запустить install.sh. Этот скрипт поставит нежные компоненты. А именно: certmgr, cpverify, cryptcp, csptest, csptestf, curl ,der2xer, genkpim, inittst, wipefile. У каждой из этих программ своя зона ответственности, свои ключи и задачи… Для задачи нужны будут только certmgr, cryptcp.
Бинарные файлы падают в /opt/cprocsp/bin/ а не в /bin, поэтому запустить их просто командой не получится. Необходимо либо запускать напрямую оттуда, либо сделать символьные ссылки. Только делать ссылку curl не стоит, ибо работает он криво: не видит список удостоверяющих центров из операционной системы, и как следствие, завершает любой запрос с ошибкой и приходится использовать ключ -k который отменяет проверку сертификата на валидность.
Как таковой, stunnel использует openssl для шифрования трафика, но ребята из КриптоПро его переписали под себя, и теперь он “дергает” утилиты для un- и de- шифрования, и называется stunnel-msspi. Поставляется он в архиве, вместе с CSP, либо можно скачать отдельно. У кого старый CSP, есть вероятность, что уже установлен, но это не точно, необходимо проверить.
Как уже выше было сказано, для stunnel линукс система будет клиентом, windows -сервером. IP-адреса будут следующими Linux — 172.22.1.65, Windows — 172.22.1.121
Следующий шаг — ключи и сертификаты. Для сервера нам необходимы сертификат и ключ, причем это все в КриптоПрошном контейнере. Для клиента только сертификат. Сертификат клиенту нужен для того, чтобы кто угодно не мог подключиться к данному туннелю. Забегая немного вперед, в конфигурационном файле stunnel есть такая опция — verify=, и вот ее параметры:
0. Не проверять сертификат сервера
1. Проверять сертификат при его наличии
2. Проверять сертификат всегда
3. Проверять наличие данного сертификата в хранилище TrustedUsers
Начиная с параметра 1 и нужен сертификат клиента для защиты самого подключения.
Итак, для генерации контейнер для сервера необходимо воспользоваться утилитой cryptcp:
cryptcp -creatcert -provtype 81 -dn “C=RU, L=Rostov-na-Donu, CN=srv, 1.2.643.100.5=305867501589415” -exprt -ex -cont “\\.\HDIMAGE\srv” -ku -certusage “1.3.6.1.5.5.7.3.1” -hashAlg “1.2.643.7.1.1.2.3” -ca http://www.cryptopro.ru/certsrv
Интересные моменты по ключам:
· provtype — указывает тип криптопровайдера. Дефолтно подставляется 75. Значение этих цифр можно узнать так: в каталоге /opt/cprocsp/sbin/amd64 лежит программа cpconfig. нужно запустить ее следующими со ключами: ./cpconfig -defprov –view_type.
Рисунок 3. cpconfig
На скриншоте выше видно, что значение 75 устарело, и соответствует ГОСТу 2001. 80 — ГОСТ 2022 256 бит и 81 — ГОСТ 2022 512 бит.
· certusage — идентификатор назначения. Для выполнения задачи необходимы два модуля: проверка подлинности клиента (1.3.6.1.5.5.7.3.2) и проверка подлинности сервера (1.3.6.1.5.5.7.3.1)
· hashAlg — алгоритм, который будет применяться. Их можно найти тут
· ca — центр сертификации, который подпишет все это добро, чтобы оно было валидно. Сертификаты и ключи валидны ТОЛЬКО в течении 3 месяцев!!! Точнее данный УЦ его выдает на 3 месяца.
· cont — контейнер, который будет создан, и в него сохранятся файлы. Если контейнер с таким именем есть — то естественно ничего не отработает.
Выше описаны самые “пикантные” моменты, которые могут отъесть много времени, остальные ключи и непонятные моменты можно найти в мануале. Кстати, проверить можно командой certmgr –list. В выводе отобразится исчерпывающую информацию по контейнерам системы и пользователя.
Переходим к генерации сертификата для клиента. Команда аналогичная, меняется только имя контейнера и идентификатор назначения сертификата.
cryptcp -creatcert -provtype 81 -dn “C=RU, L=Rostov-na-Donu, CN=srv, 1.2.643.100.5=305867501589415” -exprt -ex -cont “\\.\HDIMAGE\srv” -ku -certusage “1.3.6.1.5.5.7.3.2” -hashAlg “1.2.643.7.1.1.2.3” -ca http://www.cryptopro.ru/certsrv
С ключами и сертификатами все готово. На всякий случай, вот команда экспорта сертификата из контейнера:
certmgr -export -provtype 81 -dest /куда экспортировать сертификат/имя сертификата -cont “\\.\HDIMAGE\имя контейнера”
Таким образом будет на руках сертификат в der формате.
Следующим шагом надо приниматься за настройку stunnel, а конкретно его конфигурационного файла. Создаем в удобном месте файл stunnel.conf. Содержимое будет следующее:
setuid = root
setgid = root
pid = /var/opt/cprocsp/tmp/stunnel.pid
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
debug = 7
output = /home/bit/stunnel.log
[TestStunnel]
client = yes
accept = 0.0.0.0:13501
connect = 172.22.1.121:13500
verify = 2
cert = 0xb26305dgbhq47316f4fb80d4877383c4493b3g4d
Секция TestStunnel:
Client — указатель, является ли программа сервером или клиентом
Accept — порт, который будет открываться на локалхосте, именно к нему будет подключаться программа
Connect — ip и порт сервера, к которому будем подключаться
Verify — об этом разговор уже выше был
Cert — это как раз клиентский сертификат. Вот в этом пункте необходимо задержаться.
Можно указать этот параметр двумя способами: импортировать сертификат из контейнера, и прописать путь к файлу, или воспользоваться отпечатком сертификата. Достать отпечаток можно все той же командой certmgr –list. Идентификатор указан как SHA1 Hash.
Рисунок 4. Отпечаток в Linux
На этом настройка Linux закончена, можно запускать stunnel с указание конфига stunnel stunnel.conf.
# Windows
После установки CSP необходимо скопировать контейнер с серверным ключом и сертификатом с nix-машины.
Все контейнеры попадают в /var/opt/cprocsp/keys/username, и состоит 6 файлов с расширением .key. Копируем все, но будет небольшая проблема с импортом этого контейнера в CSP. КриптоПро считает, что хранить его на жестком диске не безопасно, и необходим токен. Этот момент можно обойти, создав эмулятор контейнера.
Для этого необходимо скачать и установить ImDisk. Затем, при помощи ImDisk Virtual Disk Driver, создать эмулятор токена (именно так его и увидит CSP, по-русски это просто контейнер HDD), и подключаем его к системе.
Рисунок 5. Псевдотокен
В итоге, рядом с жестким диском, должен появиться еще один носитель — это и есть токен. Туда и надо скопировать папку с контейнером. После этих манипуляций сертификат нормально установится в CSP.
Плюсом ко всему, желательно (обязательно) надо скопировать клиентский сертификат на сервер и тоже его поставить.
Конфигурационный файл для stunnel-msspi:
output= C:stunnelstun.log
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
debug = 7
[https]
client = no
accept = 13500
connect = 13501
#cert =E:srv1.000srv.cer
cert = 60e26867b649ec6401a42892fa9ab752e51c7e1f
CApath = TrustedPeople
verify=2
Тут все по аналогии с конфигурационным файлом клиента: accept-порт, на который подключается клиентская стуннелина (должен быть разблокирован фаерволом, проброшен во все места до наружного выхода), connect — порт для приложения (в данном случае nc).
В плане сертификата — тут та же история, либо импортим из контейнера, что совсем не рекомендуется, либо указывать отпечаток. Отпечаток можно найти в составе сертификата.
Рисунок 6. Отпечаток в Windows
Лог для дебага можно будет отключить тогда, когда все будет настроено как часы.
Далее необходимо скачать nc для Windows.
Теперь надо запустить сервер stunnel, заодно перезапустить клиента. Для дебага и теста в Windows это лучше делать с командной строки.
На сервере запускается как:
nc –nvlp 13501
На клиенте:
nc 127.0.0.1 13501
В командной строке сервера побежит лог, который расскажет, что кто-то успешно приконнектился.
Пишем в одном окне набор символов, он появляется в другом. Все настроено верно.
