Перейти к содержанию
Заказать настройку интеграции 1с с ГИИС ДМДК
При настройке интеграции stunnel с ГИИС ДМДК у некоторых пользователей не проходит связь с сайтом и в логе stunnel выдается ошибка:
Решается такая ошибка достаточно просто. А возникает из за того, что при настройке интеграции, вы забыли поместить сертификат усиленной квалифицированной электронной подписи в хранилище «Личное». Что бы устранить эту ошибку, откройте КриптоПро, на вкладке «Сервис» выберите пункт меню «Просмотреть сертификаты в контейнере»
Затем нажмите кнопку «Обзор» и из списка сертификатов выберите нужный и нажмите кнопку «ок»
В открывшемся окне просмотра сертификата, нажмите «Установить»
Перезапустите службу stunnel и проверьте связь, если все сделали правильно, все должно заработать!
«Админы делятся на тех, кто не делает бэкапы, и тех, кто уже делает». Народная мудрость.
Заказать настройку интеграции 1с с ГИИС ДМДК
Настройка рабочего места
Для настройки интеграции 1с с сервисом ГИИС ДМДК, потребуется:
Обратите внимание, stunnel.x86 — будет работать и на 32 битной и на 64 битной ОС. stunnel.x64 — только на 64 битных системах.
2. Создайте папку на диске C:\ под названием stunnel и скопируйте туда скачанный файл stunnel.x86.exe или stunnel.x64.exe.
3. Запустите командную строку от имени администратора и перейдите в каталог stunnel, выполнив команду cd c:\stunnel.
4. Введите команду установки службы туннеля: c:\stunnel\stunnel.x64 -install для 64 биных ОС, или c:\stunnel\stunnel.x86 -install для 32 битных систем.
Вместо порта 1500, можно использовать любой другой свободный порт. В параметре connect — указывается IP адрес интеграционного сервиса, где:
- 195.209.130.9 — для промышленного контура;
- 195.209.130.19 — для тестового контура.
- Скачать: http://testca2012.cryptopro.ru/cert/rootca.cer и установить корневой сертификат тестового Удостоверяющего центра в хранилище «Доверенные корневые центры сертификации»;
хранилище «Доверенные корневые центры сертификации»;
7. Создайте нового пользователя Windows.
8. В сеансе нового пользователя установите (пользовательский) сертификат, выпущенный на информационную систему Участника, в хранилище «Личное».
9. Откройте КриптоПро CSP, выберите вкладку «Сервис», нажмите кнопку «Протестировать», далее кнопку «По сертификату» и выберите личный сертификат. В открывшемся окне введите текущий пароль, обязательно поставив галочку «Сохранить пароль в системе» и нажмите «OK».
10. Откройте диспетчер сертификатов, выполнив команду certmgr.msc. Найдите и откройте личный сертификат, выберите вкладку «Состав», и нажмите кнопку «Копировать в файл». В открывшемся Мастере экспорта, необходимо экспортировать сертификат без закрытого ключа в формате Х.509 (.CER) в кодировке DER и сохранить его с именем clicer.cer в каталоге c:\stunnel.
11. Откройте Службы, выполнив команду services.msc. Выберите службу Stunnel Service и установите для неё тип запуска «Автоматически», на вкладке вход в систему с учетной записью созданного пользователя и запустите службу.
На этом настройка завершена, что бы проверить настройку интеграционного сервиса, перейдите в браузере по адресу: 127.0.0.1:1500 и если все настроено правильно, появится логотип ГИИС ДМДК.
«Админы делятся на тех, кто не делает бэкапы, и тех, кто уже делает». Народная мудрость.
ioryk Оставлено | |
Добрый день При отправке запроса появляются ошибки см приложенные логи | |
Александр Лавник Оставлено | |
Автор: ioryk Добрый день При отправке запроса появляются ошибки см приложенные логи Здравствуйте. Параметр cert – путь к файлу используемого сертификата в DER-кодировке. | |
ioryk Оставлено | |
а если указан fingerprint сертификата который находится в хранилище, кодировка же не должна иметь значения? | |
ioryk Оставлено | |
Автор: Александр Лавник Автор: ioryk Добрый день При отправке запроса появляются ошибки см приложенные логи Здравствуйте. Параметр cert – путь к файлу используемого сертификата в DER-кодировке. Не помогло bad file format | |
Александр Лавник Оставлено | |
Автор: ioryk Автор: Александр Лавник Автор: ioryk Добрый день При отправке запроса появляются ошибки см приложенные логи Здравствуйте. Параметр cert – путь к файлу используемого сертификата в DER-кодировке. Не помогло bad file format Здравствуйте. Приложите лог stunnel после перезапуска stunnel и попытки отправки запроса. | |
ioryk Оставлено | |
Проблема решена | |
Dees7 Оставлено | |
Добрый день. Все работает, но с 10 раза. 1 из 10 коннектов проходит нормально, без задержек. Чем вызваны такие зависания? gisgkh.conf Лог Отредактировано пользователем 8 апреля 2022 г. 7:30:52(UTC) | |
Максим Коллегин Оставлено | |
Возможно проблемы связаны с ограниченной доступностью CRL ГУЦ. | |
Андрей Русев Оставлено | |
Проблема в том, что при обращении за CRL-ем ГУЦ-а по этому адресу соединение ждёт открытия (а не устанавливается или получает сразу отлуп): Код:
Такое будет при любой проверке цепочки, например, сертификат Казначейства (который был промежуточным в вашем случае): Код:
Коллегам из Ростелека передал, но не факт, что это поможет. Отредактировано пользователем 7 апреля 2022 г. 19:47:59(UTC) | |
Dees7 Оставлено | |
Автор: Андрей Русев Проблема в том, что при обращении за CRL-ем ГУЦ-а по этому адресу соединение ждёт открытия Спаисбо за наводку. Все работает без ошибок. Еще раз спасибо. Отредактировано пользователем 8 апреля 2022 г. 8:27:35(UTC) | |
HappyDragone Оставлено | |
1. Настраиваю получение метки времени в службе штампов времени АУЦ Банка России. Win 10 домашняя. На Win 10 Stunnel устанавливается как служба. Создан конф файл. Подписываю в КриптоАРМ 5, где указан адрес службы TSP. Не подписывает, вылетает ошибка Описание ошибки в КриптоАРМ: Ошибка сохранения сообщения (0x80004005) Произошла ошибка при создании подписи Невозможно получить штамп времени. Ошибка отправки запроса на штамп времени. При попытке отправки запроса возникла ошибка HTTP (0xc2100100) (0x80004005) Рекомендации УЦ после моего обращения по ошибке таковы: Для того чтобы исправить данную ошибку, необходимо установить личный сертификат с привязкой к контейнеру, промежуточный сертификат Банка России и головной корневой сертификат Минком связи в хранилище «Сертификаты (локальный компьютер)» согласно инструкции по доступу к сервисам службы меток доверенного времени размещенной по ссылке http://cbr.ru/certificat…toveryayuschego_centra/. Вероятнее всего у Вас сейчас сертификаты установлены в хранилище – «сертификаты – текущий пользователь». Корневые-промежуточные установил в Локальный компьютер, а вот личный сертификат туда никак не ставится. И ошибка не уходит. Использую Крипто Про CSP 4.0.9944 Пожалуйста, подскажите, как настроить это? Может быть, кто-то сталкивался с настройкой получения метки времени на подпись через stunnel для взаимодействия со службой меток времени на подпись АУЦ Банка России. 2. Решил попробовать настроить на другом ПК с Win7 домашняя базовая. При попытке выполнить команду stunnel.exe – install в командной строке от имени Администратора вываливается: Startservicectrldispatcher being called. this may take several seconds. please wait. Как служба stunnel не появляется в оснастке “Службы”. Т.е. и здесь не судьба. А настраивать придется все-таки в Win7, в офисе везде лицензионные Win7 установлены. Пожалуйста, помогите. Что я делаю не так ?! Вдруг кто-то уже сталкивался с настройкой и удачным результатом получения метки времени на подпись в АУЦ Банка России. Если уж на Win 7 не получится, то хоть на Win 10, ибо есть одна машинка в офисе на Win 10 (не домашняя) | |
Санчир Момолдаев Оставлено | |
Добрый день! согласно документации: какой адрес тсп указываете? есть ли прокси? | |
two_oceans Оставлено | |
Вообще, если работаете на Win10, желательно бы обновиться хотя бы на последнюю сертифицированную 4.0.9963 (если лицензии на 5.0 нет), либо на 5.0 R2 или новее. Суть в тои, что Десятка постоянно меняется и если у Вас не замороженная версия Десятки давности несколько лет, то не все будет гладко работать с 9944. Цитата: Корневые-промежуточные установил в Локальный компьютер, а вот личный сертификат туда никак не ставится. Для этого нужно панель управления КриптоПро запустить с правами администратора (в 4 версии на первой вкладке общие соответствующая ссылка). Сработает если у пользователя есть права администратора (ну если с корневыми вышло, то полагаю есть). Как обычно на вкладке “Сервис” нажимаете одну из кнопок “Просмотреть сертификаты в контейнере” либо “Установить личный сертификат”. Далее в мастере находите переключатель “введенное имя задает ключевой контейнер” выбираете “компьютера”. Если был просмотр сертификатов, то нажимаете “Установить” на последнем шаге. Это должно установить сертификат в “Личные” локального компьютера. Тонкий момент разве что в том, что если хотите использовать реестр, то контейнер в реестре пользователя не видно в режиме компьютера, поэтому возможно потребуется сначала скопировать на флэшку (она видна в обоих режимах), потом обратно в реестр уже компьютера. Цитата: 2. Решил попробовать настроить на другом ПК с Win7 домашняя базовая. При попытке выполнить команду stunnel.exe – install в командной строке от имени Администратора вываливается: Пробел там не лишний между – и install? Это конечно самый простой способ создать службу, но не единственный. Также можно использовать другие способы: программку instserv (идет в комплекте у многих драйверов и программ), системную команду sc create (навскидку, у меня на Семерке создается практически одинаковый куст реестра с тем что создает сам stunnel) Код:
либо добавление файла реестра экспортированного с одного компьютера импортом на другой. В случае файла реестра потребуется перезагрузка. Ах да, не забывайте про разрядность системы. Отредактировано пользователем 28 января 2022 г. 11:15:24(UTC) | |
octsha94 Оставлено | |
Здравствуйте! 2022.01.13 13:02:21 LOG6[0]: msspi: try open cert = “clicer.cer” as file Запускаю stunnel, как приложение. Файл clicer.cer лежит в том же каталоге, что и stunnel_msspi. | |
Александр Лавник Оставлено | |
Автор: octsha94 Здравствуйте! 2022.01.13 13:02:21 LOG6[0]: msspi: try open cert = “clicer.cer” as file Запускаю stunnel, как приложение. Файл clicer.cer лежит в том же каталоге, что и stunnel_msspi. Здравствуйте. Похоже, всё-таки файла с таким именем нет в соответствующем каталоге. | |
octsha94 Оставлено | |
Автор: Александр Лавник Автор: octsha94 Здравствуйте! 2022.01.13 13:02:21 LOG6[0]: msspi: try open cert = “clicer.cer” as file Запускаю stunnel, как приложение. Файл clicer.cer лежит в том же каталоге, что и stunnel_msspi. Здравствуйте. Похоже, всё-таки файла с таким именем нет в соответствующем каталоге. | |
Александр Лавник Оставлено | |
Здравствуйте. Какое расширение у файла clicer? Приложите содержимое stunnel.conf. Каким образом запускаете stunnel_msspi? | |
octsha94 Оставлено | |
Автор: Александр Лавник Здравствуйте. Какое расширение у файла clicer? Приложите содержимое stunnel.conf. Каким образом запускаете stunnel_msspi? 1. msspi: try open cert = “ed 81 bc af 5e e6 94 af 0a e9 57 a3 63 90 8c 7c 75 41 b7 b2” as file Сертификат импортирован, как в личное хранилище пользователя, так и в хранилище локального компьютера. 2. 3. | |
basid Оставлено | |
Указан относительный путь к файлу сертификата, но текущим каталогом для службы будет %SystemRoot%\System32 ? | |
octsha94 Оставлено | |
Проблема осталась. Есть какое-то решение? | |
two_oceans Оставлено | |
У меня прописан полный путь. Смутно вспоминается, что в случае файла имеет значение еще и кодировка (BASE64 или голый DER). В случае BASE64 могут быть немного разные ограничители вида “—– BEGIN (чтототам) CERTIFICATE —–” и “—– END (чтототам) CERTIFICATE —–“. Возможно в Вашем файле ограничителей вообще нет? Короче, советую сохранить в DER без кодирования BASE64. Отпечаток у меня указан без пробелов. В случае службы пользователь под которым работает служба должен иметь права на контейнер. Код:
Отредактировано пользователем 9 февраля 2022 г. 12:37:27(UTC) | |
octsha94 Оставлено | |
Автор: two_oceans Короче, советую сохранить в DER без кодирования BASE64. У меня сертификат без закрытого ключа в формате Х.509 (.CER) в кодировке DER. Так требует сервис с которым я настраиваю интеграцию (ДМДК). | |
Андрей * Оставлено | |
Автор: octsha94 Автор: two_oceans Короче, советую сохранить в DER без кодирования BASE64. У меня сертификат без закрытого ключа в формате Х.509 (.CER) в кодировке DER. Так требует сервис с которым я настраиваю интеграцию (ДМДК). Пробелы в отпечатке убраны? | |
Андрей * Оставлено | |
Автор: octsha94 Автор: two_oceans Короче, советую сохранить в DER без кодирования BASE64. У меня сертификат без закрытого ключа в формате Х.509 (.CER) в кодировке DER. Так требует сервис с которым я настраиваю интеграцию (ДМДК). Звучит очень странно… Сертификат тестируется в КриптоПРО CSP через Сервис\Протестировать\По сертификату? | |
octsha94 Оставлено | |
Автор: two_oceans Пробелы в отпечатке убраны? Убрал пробелы. Получил ту же ошибку: 2022.02.09 13:37:45 LOG6[3]: msspi: try open cert = “9a8e02142c5e9062673c6fc7bd75a0982b9cd578” as file | |
octsha94 Оставлено | |
Автор: Андрей * Автор: octsha94 Автор: two_oceans Короче, советую сохранить в DER без кодирования BASE64. У меня сертификат без закрытого ключа в формате Х.509 (.CER) в кодировке DER. Так требует сервис с которым я настраиваю интеграцию (ДМДК). Звучит очень странно… Сертификат тестируется в КриптоПРО CSP через Сервис\Протестировать\По сертификату? Да. Check container succeed no errors were detected. Я буквально цитирую мануал: | |
Креатив
24.11.21 – 11:25
Есть крипто про 4. Необходимо установить stunnel. Интернет пишет, что он входит в комплект установки. Но там ничего подобного не видно.
Или он всё-таки устанавливается отдельно? Тогда, где его взять?
Garykom
1 – 24.11.21 – 11:28
Креатив
2 – 24.11.21 – 11:37
(1)Мне под винду.
Aleksey
3 – 24.11.21 – 11:40
(2) И?
На скриншоте как раз ссылки под винду и написано что в линуксе это встроено
Креатив
4 – 24.11.21 – 12:04
(3)Ну да. А оно с 4-й версие крипто про работать будет? И файлик подозрительно мелкий всего 89кб.
Garykom
5 – 24.11.21 – 12:05
(4) ты лучше скажи для чего собрался туннель делать
Креатив
6 – 24.11.21 – 12:06
(5)ГИИС ДМДК.
Garykom
7 – 24.11.21 – 12:28
Garykom
8 – 24.11.21 – 12:29
Для настройки клиентской станции необходимо:
1. Скачать приложение для создания TLS-туннеля stunnel.x86/x64 с
сайта https://www.cryptopro.ru/products/csp/downloads
2. Сохранить скаченное приложение в каталоге c:\stunnel
3. Запустить командную строку от имени администратора и
выполнить c:\stunnel\stunnel.x64 -install
4. В каталоге c:\windows\system32 создать файл конфигурации
stunnel.conf со следующим содержимым:
output=c:\stunnel\stunnel.log
Креатив
9 – 24.11.21 – 16:17
(7)(8)Не читал. Пока тестовый контур пробую запустить. Благодарю за помощь.
BobG
10 – 09.02.22 – 23:13
Здравствуйте. Всё сделал по инструкции. Выдаёт ошибку:
Не удалось запустить службу Stunnel Service на Локальный компьютер
Ошибка 1069: Служба не запущена из-за ошибки входа в систему.
arsik
11 – 09.02.22 – 23:34
(10) Служба от кого запускается?
BobG
12 – 09.02.22 – 23:39
От Администратора
BobG
13 – 09.02.22 – 23:52
Эта ошибка была без пароля. Поставил пароль, Ошибка 1067: Процесс был неожиданно завершён
Сергиус
14 – 10.02.22 – 00:03
(13)Попробуйте переустановить службу.
Builder
15 – 10.02.22 – 00:26
Уже выкладывал тут кусок из инструкции от ювелирсофта
https://prnt.sc/26ndwxa
Это обязательное условие!
У меня все заработало 🙂
Сергиус
16 – 10.02.22 – 01:35
(15)Есть нормальный хостинг картинок?)
Anchorite
17 – 10.02.22 – 06:25
(13) У вас журналирование настроено? В настройках stunnel.conf проверьте опцию “output” — это путь к лог-файлу. Посмотрите, что там в журнале, выложите сюда вывод.
abfm
18 – 10.02.22 – 07:08
Вопрос как решился с сертификатом? У нас 3 раз бубен и третий раз разный.
Кирпич
19 – 10.02.22 – 08:13
Если туннель запускаете под системной учетной записью, то сертификат должен быть установлен в “Сертификаты локальный компьютер”. Если под другой учетной записью, то в хранилище этой учетной записи. Пароль доступа к контейнеру должен быть сохранен. Сертификат с открытым ключем сохранить на диске и прописать к нему путь в конфиге stunnel. В инструкции всё написано.
Смысл этой байды в том, что stunnel должен иметь доступ к закрытому ключу, который у вас в хранилище. Чтобы иметь доступ к хранилищу пользователя, stunnel должен запускаться от этого пользователя. Пароль от контейнера он спрашивать не умеет, потому пароль должен быть вбит заранее и сохранен (галку там поставить).
abfm
20 – 10.02.22 – 08:58
(19)Да конечно всё по инструкции. Всё от одного пользователя. Сертификат сохранен без ключа. Прописан в конфиге. При старте ругается на сертификат. Где то только в консольной версии работает. Где то как служба. ДМДК пишут об обезличенном сертификате, народ утверждает что такие не выдают для ип (проверить не могу). Чем он лучше не говорят. ЮвелирСофт всё молиться на прямые руки сисадмина и просит 14000 за настройку stunnel.
Всем привет! Я Максим, бэкенд-разработчик команды MSB (корпоративная сервисная шина), занимаюсь интеграциями систем для внутренних нужд компании Tele2, и в этом посте хочу поделиться опытом интеграции с “КриптоПро DSS” поверх ГОСТ TLS.
Введение
В связи с экономией на бумаге ростом цифровизации бизнес-процессов, в частности, с постепенным уходом от традиционных бумажных документов к электронному документообороту, возникла потребность реализовать электронную подпись документов у нас в компании.
В качестве сервера электронной подписи используется комплекс “КриптоПро DSS”, имеющий возможность встроить двухфакторное подтверждение операций подписания в мобильное приложение, посредством своего DSS SDK.
Мы встроили данный SDK в наше корпоративное мобильное приложение, о котором писала моя коллега в своей статье на Хабре.
Но мой рассказ связан с опытом решения задачи со стороны бэкенда, и мы рассмотрим эту задачу подробнее.
Описание проблемы и её решение
В нашей схеме подключение к серверу электронной подписи осуществляется по ГОСТ TLS с аутентификацией клиента по сертификату.
Но не секрет, что стандартные платформы, а именно горячо любимый мной .NET, не поддерживают российские криптошифры по ГОСТу.
В качестве эксперимента пробовал подключить rtengine, но он не завёлся, и, помимо прочего, он не является сертифицированным средством защиты информации. В таких случаях “КриптоПро” советует использовать “КриптоПро Stunnel”.
Изначально, stunnel – это open-source приложение, выступающее в роли шлюза, который принимает незашифрованный трафик и пересылает его на целевой сервер поверх TLS. Часто используется, когда клиент сам не поддерживает TLS-шифрование.
А Stunnel от “КриптоПро” – это практически тот же stunnel, но с поддержкой ГОСТ TLS, а значит, он замечательно подходит для решения нашей проблемы.
Представленная выше схема рабочая, если бы не одно но: согласно политикам безопасности в компании, все запросы во внешнюю сеть Интернет могут осуществляться только через корпоративный прокси. Ванильный stunnel из коробки умеет делать запросы через прокси, но “КриптоПро” эту фичу выпилил в своей редакции.
Чтобы обойти это ограничение, в схему было решено добавить еще одно известное Linux-администраторам приложение socat (еще один шлюз, в своем роде), который умеет делать подключения через HTTP-прокси. Важное условие – HTTP-прокси должен разрешать подключения через метод CONNECT.
В итоге схема станет такой:
Docker
Для упрощения было решено пренебречь правилом “один контейнер – один процесс” и запускать “КриптоПро Stunnel” и socat в одном контейнере. Данный контейнер поднимается в виде sidecar рядом с основным контейнером микросервиса. Это позволяет нашему микросервису общаться с “КриптоПро DSS” так, как будто бы они общались по http-протоколу, а вопросы шифрования трафика по ГОСТ TLS отдаются на откуп контейнеру с stunnel и socat.
Чтобы подготовить образ контейнера, нужно скачать deb-пакет с “КриптоПро CSP” (именно в составе этого дистрибутива и состоит “КриптоПро Stunnel”). К сожалению, скачать пакет нельзя по прямой ссылке, которую можно было бы прописать в Dockerfile (иначе бы статья получилась в два раза короче). Для скачивания нужно пройти регистрацию на сайте “КриптоПро”, и только потом будет дана возможность скачать пакет.
Ниже приведен пример Dockerfile, скриптов инициализации и конфига для “КриптоПро Stunnel”.
Рабочий пример можно также посмотреть здесь.
Dockerfile
FROM debian:buster-slim
EXPOSE 80/tcp
ARG TZ=Europe/Moscow
ENV PATH="/opt/cprocsp/bin/amd64:/opt/cprocsp/sbin/amd64:${PATH}"
# stunnel settings
ENV STUNNEL_HOST="example.cryptopro.ru:4430"
ENV STUNNEL_HTTP_PROXY=
ENV STUNNEL_HTTP_PROXY_PORT=80
ENV STUNNEL_HTTP_PROXY_CREDENTIALS=
ENV STUNNEL_DEBUG_LEVEL=5
ENV STUNNEL_CERTIFICATE_PFX_FILE=/etc/stunnel/certificate.pfx
ENV STUNNEL_CERTIFICATE_PIN_CODE=
# dependencies
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \
&& echo $TZ > /etc/timezone \
&& apt-get update \
&& apt-get -y install lsb-base curl socat \
&& rm -rf /var/lib/apt/lists/*
# install cryptopro csp
WORKDIR /dist
COPY dist/csp_deb.tgz csp_deb.tgz
RUN tar -zxvf csp_deb.tgz --strip-components=1 \
&& ./install.sh cprocsp-stunnel
WORKDIR /
COPY conf/ /etc/stunnel
COPY bin/docker-entrypoint.sh docker-entrypoint.sh
COPY bin/stunnel-socat.sh stunnel-socat.sh
RUN chmod +x /docker-entrypoint.sh /stunnel-socat.sh
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["stunnel_thread", "/etc/stunnel/stunnel.conf"]
docker-entrypoint.sh
#!/bin/bash
# скрипт инициализации
# ---------------------------------
# настройка csp
echo "Configuring CryptoPro CSP..."
# импорт сертификата с закрытым ключом
if [[ ! -f "$STUNNEL_CERTIFICATE_PFX_FILE" ]]; then
echo "Client certificate not found in ${STUNNEL_CERTIFICATE_PFX_FILE}"
exit 1
fi
certmgr -install -pfx -file "${STUNNEL_CERTIFICATE_PFX_FILE}" -pin "${STUNNEL_CERTIFICATE_PIN_CODE}" -silent || exit 1
echo "Certificate was imported."
echo
# определение контейнера-хранилища закрытых ключей
containerName=$(csptest -keys -enum -verifyc -fqcn -un | grep 'HDIMAGE' | awk -F'|' '{print $2}' | head -1)
if [[ -z "$containerName" ]]; then
echo "Keys container not found"
exit 1
fi
# установка сертификата клиента
certmgr -inst -cont "${containerName}" -silent || exit 1
# экспорт сертификата для stunnel
exportResult=$(certmgr -export -dest /etc/stunnel/client.crt -container "${containerName}")
if [[ ! -f "/etc/stunnel/client.crt" ]]; then
echo "Error on export client certificate"
echo "$result"
exit 1
fi
echo "CSP configured."
echo
# ---------------------------------
# запуск socat
echo "Starting socat..."
nohup bash /stunnel-socat.sh </dev/null >&1 2>&1 &
# ---------------------------------
# запуск stunnel
echo "Configuring stunnel..."
sed -i "s/^debug=.*$/debug=$STUNNEL_DEBUG_LEVEL/g" /etc/stunnel/stunnel.conf
echo "Starting stunnel"
exec "$@"
stunnel-socat.sh
#!/bin/bash
echo Configuring socat...
socatParameters="TCP:${STUNNEL_HOST}"
if [[ -n "$STUNNEL_HTTP_PROXY" ]]; then
# если указан http-прокси, подключение будет происходить через него
socatParameters="PROXY:${STUNNEL_HTTP_PROXY}:${STUNNEL_HOST},proxyport=${STUNNEL_HTTP_PROXY_PORT}"
if [[ -n "$STUNNEL_HTTP_PROXY_CREDENTIALS" ]]; then
socatParameters="${socatParameters},proxyauth=${STUNNEL_HTTP_PROXY_CREDENTIALS}"
fi
fi
socatCmd="socat UNIX-LISTEN:/var/run/socat.sock,reuseaddr,fork ${socatParameters}"
while true; do
rm -f /var/run/socat.sock
echo $(date) "Start socat instance."
${socatCmd}
sleep 1
done
stunnel.conf
foreground=yes
pid=/var/opt/cprocsp/tmp/stunnel_cli.pid
output=/dev/stdout
debug=5
[https]
client=yes
accept=80
cert=/etc/stunnel/client.crt
verify=0
connect=/var/run/socat.sock
Про Dockerfile рассказывать не буду, он достаточно тривиален, а вот скрипт инициализации docker-entrypoint.sh интереснее. Первым делом скрипт импортирует сертификат с закрытым ключом в хранилище ключей, так как “КриптоПро Stunnel” для работы необходим закрытый ключ. Затем из хранилища экспортируется сертификат с открытым ключом в формате DER. В дальнейшем по этому сертификату “КриптоПро Stunnel” будет получать закрытый ключ из хранилища ключей.
После инициализации хранилища ключей происходит настройка и запуск socat. Для конфигурирования socat добавлены переменные окружения, которые позволяют указать, через какой HTTP-прокси необходимо выполнять запросы. Не буду останавливаться на этих переменных – их описание есть в репозитории. Однако не лишним будет уточнить, что, если переменные не указаны, socat будет самостоятельно выполнять TCP-запросы до целевого сервера. Для получения входящих запросов socat открывает unix-сокет, на который и будет обращаться “КриптоПро Stunnel”.
Финальным шагом в скрипте являются конфигурирование Stunnel и его последующий запуск.
“КриптоПро Stunnel” при запуске начинает прослушивать порт 80, то есть принимать голый HTTP-трафик. HTTP-трафик будет шифроваться по ГОСТу и пересылаться на unix-сокет, который слушает socat. Socat, в свою очередь, откроет соединение с целевым сервером, напрямую или через HTTP-прокси, и отправит уже шифрованный запрос.
Шифрованный ответ от целевого сервера пройдет ту же цепочку, только обратном порядке, и вызывающему приложению будет возвращен ответ в виде plain text, что позволит не реализовывать ГОСТ TLS внутри приложений (если такая реализация вообще возможна).
Вместо заключения
К сожалению, документация по отечественным решениям зачастую достаточно скромна. К примеру, на попытки заставить работать “КриптоПро Stunnel” через HTTP-прокси ушло много времени, пока не пришло понимание, что “КриптоПро Stunnel” прокси не поддерживает и что без еще одного инструмента не обойтись.
Данная статья призвана помочь сберечь ваше время, надеюсь, описанное окажется полезным.
Бонус
В качестве бонуса хотелось бы поделиться несколькими советами:
Список ресурсов
stunnel TLS Proxy
Шифрование TLS-трафика по алгоритмам ГОСТ-2012 c Stunnel
Экономим бюджет компании, или как построить ГОСТовский крипто-туннель с минимальными затратами
Автор статьи: Роман Вегелин
Содержание1. Введение2. Задача3. В бой a. Linux b. Windows
Для любого системного администратора или DevOps’а построить VPN или пробросить нестандартный метод инкапсуляции пакетов (туннелирование) не очень сложно. Часто для этого используют OpenVPN для постоянного использования, либо ssh-туннелирование на один-два раза. Однако есть организации, которые должны соблюдать строгие рамки передачи данных, установленные законодательством. Под такие организации попадают банки, микрофинансовые организации (да и многие организации, которые так или иначе имеют отношения к финансовым операциям). Защита персональных данных тоже является “защищаемой информацией” во всех законопроектах и положениях.
В результате, опять же по законодательству, при шифровании необходимо использовать СКЗИ со всеми необходимыми ФСТЕКовскими сертификатами и лицензиями, которые удовлетворяют необходимые требования. Одним из таких программных обеспечений является КриптоПро CSP. И в данной статье будем разбирать как “прокинуть” сетевой туннель средствами stunnel, который будет шифроваться КриптоПро CSP, заодно получим хоть и тестовый (на 3 месяца), но полностью валидный по GOST_2012.
Задача
Для начала необходимо разбираться как эта все будет работать и поставить конкретные задачу.
К примеру, есть две машины. Чтобы показать настройку двух операционных систем, одна будет на Linux Ununtu, версия не важна, но желательно не ниже 16), вторая на Windows 10. На win-системе будет запускаться NC на прослушку какого-то определенного порта, а с nix-системы будут передаваться пакеты. Таким образом windows будет сервером. В отношении настроек stunnel такая же ранжировка: Windows — сервер.
Что должно получиться в итоге получить? При подключении с Linux к Windows программой NC, все пакеты будут шифроваться сертификатом GOST_2012, и сертифицированным программным обеспечением. Задача тривиальная, чтобы показать возможность такого маневра. Так, как 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 — ГОСТ 2012 256 бит и 81 — ГОСТ 2012 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 = rootsetgid = rootpid = /var/opt/cprocsp/tmp/stunnel.pidsocket = l:TCP_NODELAY=1socket = r:TCP_NODELAY=1
debug = 7output = /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:\stunnel\stun.logsocket = l:TCP_NODELAY=1socket = r:TCP_NODELAY=1debug = 7
[https]
client = no
accept = 13500
connect = 13501
#cert =E:\srv1.000\srv.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
В командной строке сервера побежит лог, который расскажет, что кто-то успешно приконнектился.Пишем в одном окне набор символов, он появляется в другом. Все настроено верно.