19 сентября 2016 г.

Настройка КриптоПро и Stunnel для ГОСТ TLS (для автоматизированного обмена с бюро кредитных историй)

Всем доброго дня.
Недавно ко мне обратился знакомый с вопросом по реализации шифрованного по алгоритму ГОСТ 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 

Создаем файл конфигурации с нужными нам настройками для stunnel 
sudo 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

6 комментариев:

  1. Что нибудь известно по поводу сертификации Stunnel ?
    Какие области применения видишь для этого решения?

    ОтветитьУдалить
    Ответы
    1. По сертификации для Linux все просто: Stunnel включен в дистрибутив КриптоПро.
      Для Windows затрудняюсь сходу ответить: Stunnel сам по себе не является СКЗИ, по сути - это вспомогательная утилита для CSP. Но это только мое "мнение на пальцах". За полтора года я уже изрядно подзабыл нормативку.

      Сфера применения: опять те же БКИ (как минимум два), веб-сервисы ГИС ЖКХ (статья в базе знаний КриптоПро) или аналогичные веб-сервисы с гостовым шифрованием и проверкой подлинности клиента по сертификату.
      Конкретно в данной решается вопрос шифрованного канала, где в результате с другой стороны данного решения имеем "открытый" интерфейс веб-сервиса, под который уже проще писать клиента на PHP, Java, Python, когда он не должен будет еще и ГОСТ/TLS поднимать.

      Удалить
  2. удобный бы deb / rpm пакет для установки! Заходи к гости - www.pcded.blogspot.com

    ОтветитьУдалить
    Ответы
    1. Так все устанавливается как раз из deb/rpm пакетов. Больше времени занимает настройка всего этого хозяйства.

      Удалить
  3. - отключить проверку сертификатов в TLS в файле настроек CSP
    Как? В файле config.ini есть параметр tls_client_disable_revocation_check, но конкретно на АРМ платформе оно так и не работает.

    ОтветитьУдалить
  4. у вас ошибка в конфиге
    client = /etc/stunnel/test_user_7a8110.cer
    должно быть
    cert = /etc/stunnel/test_user_7a8110.cer

    ОтветитьУдалить