Всем доброго дня.
Недавно ко мне обратился знакомый с вопросом по реализации шифрованного по алгоритму ГОСТ TLS-канала для работы с веб-сервисами некоторых БКИ.
Немного помыслив, вспомнил, что есть такая замечательная штука как stunnel, которая может TLS как в режиме сервера, так и в режиме клиента. Плюс к этому компания КриптоПро сделала форк stunnel с оптимизацией под российские криптоалгоритмы. В итоге родился небольшой гайд по реализации простого и бюджетного варианта, которым и хочу поделиться с вами.
В качестве примера приводится настройка stunnel в качестве TLS клиента:
1) к серверу НБКИ без авторизации пользователя;
2) к тестовому УЦ КриптоПро с авторизацией пользователя по сертификату.
В данном материале использовались OC Debian 8.3 x86 и КриптоПро CSP 4.0.9708 (Nechaev) от 01.03.2016 (stunnel включен).
Нам понадобятся два сертификата:
- корневой сертификат УЦ Крипто-Про. Данным сертификатом подписан сертификат веб-сервера НБКИ;
- корневой сертификат тестового УЦ КриптоПро. Данным сертификатом подписан сертификат веб-сервера тестового УЦ КриптоПро и тестовый сертификат нашего пользователя.
Сначала немного теории "на пальцах".
В протоколе TLS предусмотрена односторонняя и двусторонняя аутентификация. Под односторонней чаще всего понимается аутентификация веб-сервера, когда сервер доказывает клиенту что действительно владеет закрытым ключом предъявленного цифрового сертификата. Под двусторонней аутентификацией сервер и клиент доказывают это друг другу.
В КриптоПро ключевая информация (ключи шифрования) хранятся в контейнере (с точки зрения файловой системы - это каталог с несколькими файлами). В качестве носителя может выступать (чаще всего) дискета, флешка, токен, ветка реестра (Windows) или каталог (Linux). И если клиент или сервер проходят взаимную аутентификацию (доказывают владение ключами), то они должны иметь не только цифровой сертификат с открытым ключом, но и сам контейнер с ключами.
Опустим процесс создания тестового ключа в тестовом УЦ КриптоПро и начем с того момента, что у нас есть ключевой контейнер с именем "test" на флешке.
Монтируем флешку
Есть два способа: ручной и с помощью утилиты. Я скопировал вручную
Создаем скрипт запуска. Также будут доступны команды управления start, stop, restart.
Пример команды для перезагрузки stunnel:
1) Не открывается сайт через stunnel
Что нужно сделать:
- проверить адрес и порт в конфиге
- в браузере открывать не только сам адрес stunnel, а полный путь.
Пример: не 10.0.0.123:8181, а 10.0.0.123:8181/se/login
2) Следующие ошибки в логе
- периодически вручную импортировать актуальный CRL с помощью certmgr;
- отключить проверку сертификатов в TLS в файле настроек CSP
КриптоПро CSP
КриптоПро Stunnel
Официальные мануалы по КриптоПро Stunnel
Ключевые слова для поисковых систем: настройка БКИ, автоматизированый обмен с бюро кредитных историй, автоматическое получение отчетов с бюро кредитных историй, КриптоПро и БКИ, обмен с бюро кредитных историй, шифрование трафика криптопро, криптопро на linux
Недавно ко мне обратился знакомый с вопросом по реализации шифрованного по алгоритму ГОСТ TLS-канала для работы с веб-сервисами некоторых БКИ.
Немного помыслив, вспомнил, что есть такая замечательная штука как stunnel, которая может TLS как в режиме сервера, так и в режиме клиента. Плюс к этому компания КриптоПро сделала форк stunnel с оптимизацией под российские криптоалгоритмы. В итоге родился небольшой гайд по реализации простого и бюджетного варианта, которым и хочу поделиться с вами.
В качестве примера приводится настройка stunnel в качестве TLS клиента:
1) к серверу НБКИ без авторизации пользователя;
2) к тестовому УЦ КриптоПро с авторизацией пользователя по сертификату.
В данном материале использовались OC Debian 8.3 x86 и КриптоПро CSP 4.0.9708 (Nechaev) от 01.03.2016 (stunnel включен).
1. Установка Крипто-Про CSP и stunnel
Скачиваем архив CSP с сайта КриптоПро и распаковываемtar zxvf linux-ia32_deb.tgz
cd linux-ia32_deb
Установливаем минимально необходимый набор пакетовsudo apt-get install lsb-core
sudo dpkg -i lsb-cprocsp-base_4.0.0-4_all.deb
sudo dpkg -i lsb-cprocsp-rdr_4.0.0-4_i386.deb
sudo dpkg -i lsb-cprocsp-capilite_4.0.0-4_i386.deb
sudo dpkg -i lsb-cprocsp-kc1_4.0.0-4_i386.deb
sudo dpkg -i cprocsp-stunnel_4.0.0-4_i386.deb
2. Импорт корневых сертификатов
Импортируем корневые сертификаты КриптоПро в локальное хранилище сертификатов.Нам понадобятся два сертификата:
- корневой сертификат УЦ Крипто-Про. Данным сертификатом подписан сертификат веб-сервера НБКИ;
- корневой сертификат тестового УЦ КриптоПро. Данным сертификатом подписан сертификат веб-сервера тестового УЦ КриптоПро и тестовый сертификат нашего пользователя.
/opt/cprocsp/bin/ia32/certmgr -inst -file <home>/cert/ca_cryptopro_4aad6f_der.cer -store ROOT
/opt/cprocsp/bin/ia32/certmgr -inst -file <home>/cert/ca_test_cryptopro_4487da_der.cer -store ROOT
После импортирования полезно просмотреть список установленных корневых сертификатов/opt/cprocsp/bin/ia32/certmgr -list -store ROOT
3. Копирование ключевого контейнера пользователя
Наверное, это самая запутанная и самая важная часть данного руководства.Сначала немного теории "на пальцах".
В протоколе TLS предусмотрена односторонняя и двусторонняя аутентификация. Под односторонней чаще всего понимается аутентификация веб-сервера, когда сервер доказывает клиенту что действительно владеет закрытым ключом предъявленного цифрового сертификата. Под двусторонней аутентификацией сервер и клиент доказывают это друг другу.
В КриптоПро ключевая информация (ключи шифрования) хранятся в контейнере (с точки зрения файловой системы - это каталог с несколькими файлами). В качестве носителя может выступать (чаще всего) дискета, флешка, токен, ветка реестра (Windows) или каталог (Linux). И если клиент или сервер проходят взаимную аутентификацию (доказывают владение ключами), то они должны иметь не только цифровой сертификат с открытым ключом, но и сам контейнер с ключами.
Опустим процесс создания тестового ключа в тестовом УЦ КриптоПро и начем с того момента, что у нас есть ключевой контейнер с именем "test" на флешке.
Монтируем флешку
sudo mount /dev/sdb1 /media/sdb1/
Копируем контейнер с флешки на HDDЕсть два способа: ручной и с помощью утилиты. Я скопировал вручную
cp -r /media/sdb1/test.000/ /var/opt/cprocsp/keys/stunnel/
Проверим сертификат в контейнереcertmgr -list -cont '\\.\HDIMAGE\test'
Проверим работоспособность ключейcsptest -keyset -check -cont '\\.\HDIMAGE\test'
Экспортируем сертификат пользователя в файл (он еще понадобится)certmgr -export -dest test_user_7a8110.cer -cont '\\.\HDIMAGE\test'
Делаем привязку данного сертификата пользователя к нашему контейнеруcertmgr -inst -file test_user_7a8110.cer -cont '\\.\HDIMAGE\test'
Проверяем локальное хранилище сертификатов пользователя certmgr -list -store My
Проверяем локальное хранилище сертификатов пользователя PrivateKey Link : Yes
Container : HDIMAGE\\test.000\2EF8
4. Создание файла конфигурации Stunnel
Создаем файл конфигурации с нужными нам настройками для stunnelsudo mkdir /etc/stunnel
sudo vim /etc/stunnel/stunnel.conf
Содержимое файла конфигурации:setgid = stunnel
setuid = stunnel
pid=/var/opt/cprocsp/tmp/stunnel_cli.pid
output=/var/opt/cprocsp/tmp/stunnel_cli.log
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
debug = 3
client = yes
[stunnel.nbki]
accept = <IP address>:8181
connect = icrs.nbki.ru:443
verify=2
[stunnel.test_uc]
accept = <IP address>:8282
connect = www.cryptopro.ru:5555
client = /etc/stunnel/test_user_7a8110.cer
verify=2
Запускаем процесс/opt/cprocsp/sbin/amd64/stunnel_thread /etc/stunnel/stunnel.conf
Проверяем результат5. Автоматический запуск Stunnel
Когда все заработало должным образом, то было бы неплохо автоматизировать запуск stunnel при загрузке ОС.Создаем скрипт запуска. Также будут доступны команды управления start, stop, restart.
Пример команды для перезагрузки stunnel:
sudo service stunnel_thread restart
Создаем скриптsudo vim /etc/init.d/stunnel_thread
и помещаем в него следующий текст:#!/bin/sh
### BEGIN INIT INFO
# Provides: stunnel
# Default-Start: 3 5
# Default-Stop: 0 1 6
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Short-Description: Start daemon at boot time
# Description: Enable stunnel by daemon.
### END INIT INFO
PATH_DAEMON=/opt/cprocsp/sbin/ia32
DAEMON=stunnel_thread
CONFIG=/etc/stunnel/stunnel.conf
test -x $PATH_DAEMON/$DAEMON || exit 0
case "$1" in
start)
$PATH_DAEMON/$DAEMON $CONFIG
;;
stop)
pkill -f $DAEMON
;;
restart)
pkill -f $DAEMON
sleep 3
$PATH_DAEMON/$DAEMON $CONFIG
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac
exit 0
Добавляем в автозагрузкуsudo update-rc.d stunnel_thread defaults
6. Troubleshooting
Частые ошибки, с которыми я столкнулся и можете столкнуться вы.1) Не открывается сайт через stunnel
Что нужно сделать:
- проверить адрес и порт в конфиге
- в браузере открывать не только сам адрес stunnel, а полный путь.
Пример: не 10.0.0.123:8181, а 10.0.0.123:8181/se/login
2) Следующие ошибки в логе
Error 0x40 ((unknown)) returned by CertVerifyCertificateChainPolicy!
и/илиError 0x40 when validate certificate
Ошибка возникает из-за того, что stunnel не может проверить сертификат по списку отзыва CRL. Проблему можно решить тремя вариантами (но с разной эффективностью):- периодически вручную импортировать актуальный CRL с помощью certmgr;
- отключить проверку сертификатов в TLS в файле настроек CSP
/etc/opt/cprocsp/config.ini
- в файле настроек CSP (написан выше) указать корректный путь к библиотеке curl. "libcurl.so" = "/usr/lib/i386-linux-gnu/libcurl.so.4"
7. Ссылки
Тестовый Удостоверяющий Центр КриптоПроКриптоПро CSP
КриптоПро Stunnel
Официальные мануалы по КриптоПро Stunnel
Ключевые слова для поисковых систем: настройка БКИ, автоматизированый обмен с бюро кредитных историй, автоматическое получение отчетов с бюро кредитных историй, КриптоПро и БКИ, обмен с бюро кредитных историй, шифрование трафика криптопро, криптопро на linux
Что нибудь известно по поводу сертификации Stunnel ?
ОтветитьУдалитьКакие области применения видишь для этого решения?
По сертификации для Linux все просто: Stunnel включен в дистрибутив КриптоПро.
УдалитьДля Windows затрудняюсь сходу ответить: Stunnel сам по себе не является СКЗИ, по сути - это вспомогательная утилита для CSP. Но это только мое "мнение на пальцах". За полтора года я уже изрядно подзабыл нормативку.
Сфера применения: опять те же БКИ (как минимум два), веб-сервисы ГИС ЖКХ (статья в базе знаний КриптоПро) или аналогичные веб-сервисы с гостовым шифрованием и проверкой подлинности клиента по сертификату.
Конкретно в данной решается вопрос шифрованного канала, где в результате с другой стороны данного решения имеем "открытый" интерфейс веб-сервиса, под который уже проще писать клиента на PHP, Java, Python, когда он не должен будет еще и ГОСТ/TLS поднимать.
удобный бы deb / rpm пакет для установки! Заходи к гости - www.pcded.blogspot.com
ОтветитьУдалитьТак все устанавливается как раз из deb/rpm пакетов. Больше времени занимает настройка всего этого хозяйства.
Удалить- отключить проверку сертификатов в TLS в файле настроек CSP
ОтветитьУдалитьКак? В файле config.ini есть параметр tls_client_disable_revocation_check, но конкретно на АРМ платформе оно так и не работает.
у вас ошибка в конфиге
ОтветитьУдалитьclient = /etc/stunnel/test_user_7a8110.cer
должно быть
cert = /etc/stunnel/test_user_7a8110.cer