logo Наши способы организации безопасного удалённого доступа к рабочим местам и корпоративным ресурсам
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline ahtohio  
#1 Оставлено : 8 октября 2019 г. 15:09:13(UTC)
ahtohio

Статус: Новичок

Группы: Участники
Зарегистрирован: 09.10.2017(UTC)
Сообщений: 4

Добрый день.
Пытаюсь собрать python версии 3.7 для работы по tls на алгоритмах из ГОСТа.
Я находил вопросы по данной теме, но они касались питона версии 2.7 и код _ssl.py слегка изменился.
Для облегчения задачи взял уже собранный OpenSSL с поддержкой гостовских шифров отсюда: Докер образ
Далее клонирую исходники питона с оф. репозитория и выполняю
Цитата:
./configure --with-openssl=/usr/local/ssl
make
make install

Питон собирается, однако нужные шифры не добавляются. Как я проверял:
Цитата:
python3 -c "import ssl; ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1); ctx.set_ciphers('GOST2012-GOST8912-GOST8912')"

Шифр по идее должен подключиться без ошибок.
В /usr/local/ssl/openssl.cnf уже из коробки прописано подключение GOST engine, я также пробовал редактировать _ssl.c согласно этого вопроса. Как я говорил, 3 версия отличается и я менял код (действовал по наитию) с
Цитата:
/* Load all algorithms and initialize cpuid */
OPENSSL_add_all_algorithms_noconf();
/* Init OpenSSL */
SSL_load_error_strings();
SSL_library_init();

На
Цитата:
OPENSSL_config(NULL);
/* Load all algorithms and initialize cpuid */
OPENSSL_add_all_algorithms_conf();
/* Init OpenSSL */
SSL_load_error_strings();
SL_library_init();
(ну и #include "openssl/conf.h" в начале, после #include "openssl/rand.h")
Указание пути в OPENSSL_config не помогло. Ему даже можно указать неправильный путь и ошибок не будет.

Что я делаю не так? От того же автора есть docker образ c php и мне не удалось провести параллели для сборки python. В самом противном случае придется для взаимодействия использовать собранный здесь же curl с ГОСТ.
Offline two_oceans  
#2 Оставлено : 9 октября 2019 г. 5:55:20(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 975
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 62 раз
Поблагодарили: 219 раз в 206 постах
По конкретному случаю наверно мало что подскажу, но в целом идея когда не помогает openssl_conf - попробуйте получить информацию о пути, по которому openssl ищет конфиг и движки. Это может быть совершенно не та папка /usr/local/ssl/ В случае чисто openssl команда выглядит так
Код:
openssl version -a


Например, у меня openssl 1.1.0 собранный под windows и он автоматически грузит движок из определенной папки C:\Program Files (x86)\OpenSSL\lib\engines-1_1, прописанной при сборке. Фактически openssl лежит совсем в другой папке. Если указать этот же движок в конфиге указанном в переменной окружения или командной строке, возникает конфликт, поэтому мне в итоге пришлось выкинуть подгрузку движка из конфига и создать по тому пути символическую ссылку на папку, в которой движок.

Еще возможен вариант, что там движок не от КриптоПро (это можно увидеть по выводу openssl engine).

Отредактировано пользователем 9 октября 2019 г. 5:59:56(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил two_oceans за этот пост.
Андрей * оставлено 09.10.2019(UTC)
Offline ahtohio  
#3 Оставлено : 9 октября 2019 г. 13:27:34(UTC)
ahtohio

Статус: Новичок

Группы: Участники
Зарегистрирован: 09.10.2017(UTC)
Сообщений: 4

Спустя некоторое количество проб и ошибок, проблема решилась так:
В Modules/_ssl.c существует такой участок кода:
Цитата:
#ifndef OPENSSL_VERSION_1_1
/* Load all algorithms and initialize cpuid */
OPENSSL_add_all_algorithms_noconf();
/* Init OpenSSL */
SSL_load_error_strings();
SSL_library_init();
#endif

Все найденные мной ответы, что касались объединения OpenSSL с гостом и Python, работали для версии Python=2.7
И на 2.7 версии не существовало части
Цитата:
#ifndef OPENSSL_VERSION_1_1

В настоящее же время, при попытке собрать OpenSSL 1.1.0g (и то не самая свежая версия) и Python 3.7 указанный код выше не выполнялся вовсе (так как для OpenSSL 1.1+ объявлялась OPENSSL_VERSION_1_1).

Мое решение:
Добавить строку
Цитата:
OPENSSL_add_all_algorithms_conf();
куда-нибудь вне этого ifndef блока. Я добавил сразу над ним:
Цитата:

OPENSSL_add_all_algorithms_conf();
#ifndef OPENSSL_VERSION_1_1
/* Load all algorithms and initialize cpuid */
OPENSSL_add_all_algorithms_noconf();
/* Init OpenSSL */
SSL_load_error_strings();
SSL_library_init();
#endif


Таким образом, будет прочитан openssl.cnf и добавлены гостовские шифры.
Offline nick.moskv  
#4 Оставлено : 6 ноября 2019 г. 18:19:03(UTC)
nick.moskv

Статус: Новичок

Группы: Участники
Зарегистрирован: 06.11.2019(UTC)
Сообщений: 2

Добрый день!
Пытаюсь также собрать Python поддерживающий шифрование по госту.
На данный момент есть redhat с OPENSSL 1.1.0g с поддержкой госта. Также пересобрал CURL, и CURL может шифровать https по госту.
PYTHON пересобрать так и не получилось пока, пробую версию 3.6.8
OPENSSL_VERSION выдает корректную, но работать по госту отказывается. Можете более подробную инструкцию выложить, как собрать python с гостом?
Offline ahtohio  
#5 Оставлено : 6 ноября 2019 г. 19:54:14(UTC)
ahtohio

Статус: Новичок

Группы: Участники
Зарегистрирован: 09.10.2017(UTC)
Сообщений: 4

Предложенный мной вариант практически костыль, должен быть более правильный способ.
Вот докерфайл, где мне удалось собрать: https://pastebin.com/wtzpFjQE
Напомню, что если задача стоит взаимодействия по https с гостом, то библиотеке requests нужно принудительно указывать поддержку госта.
Offline nick.moskv  
#6 Оставлено : 6 ноября 2019 г. 20:02:38(UTC)
nick.moskv

Статус: Новичок

Группы: Участники
Зарегистрирован: 06.11.2019(UTC)
Сообщений: 2

--- Напомню, что если задача стоит взаимодействия по https с гостом, то библиотеке requests нужно принудительно указывать поддержку госта.
Как?
ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1); ctx.set_ciphers('GOST2012-GOST8912-GOST8912')" ???
Offline ahtohio  
#7 Оставлено : 6 ноября 2019 г. 20:07:55(UTC)
ahtohio

Статус: Новичок

Группы: Участники
Зарегистрирован: 09.10.2017(UTC)
Сообщений: 4

Ну, можно так: https://pastebin.com/NTVaGfq9
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.