@SlimHouse
Сквозь тернии к звездам

Как заставить работать python c модифицированной OpenSSL (с поддержкой ГОСТ)?

Пытаюсь заставить работать python 2.7 с OpenSSL, скомпилированной с поддержкой ГОСТов. Сконфигурировал OpenSSL
./config shared zlib enable-rfc3779
и потом установил (make depend, make, make test, make install). Добавил в openssl.conf:
openssl_conf = openssl_def
[openssl_def]
engines = engine_section
[engine_section]
gost = gost_section
[gost_section]
engine_id = gost
default_algorithms = ALL

После этого команда openssl ciphers | tr ":" "\n" | grep GOST начала возвращать следующее:
GOST2001-GOST89-GOST89
GOST94-GOST89-GOST89

и openssl s_client -connect test.domain.ru:443 успешно коннектится к сайту и запросы успешно выполняются (стандартная либа не работает таким образом). После этого пытаюсь собрать питон с поддержкой новой либы: попробовал раскомментить переменную SSL в Modules/Setup.dist и еще пару строк ниже, которые относятся к компиляции ssl, также проверил переменные ssl_incs и ssl_libs в setup.py во время установки (они содержат именно ту папку, в которой лежит новый опенссл). Далее поставил питон в домашнюю папку. Но при запуске такого скрипта все равно получаю ошибку
import urllib2
print(urllib2.urlopen('https://test.domain.ru/').read())


urllib2.URLError: <urlopen error [Errno 1] _ssl.c:501: error:140920F8:SSL routines:SSL3_GET_SERVER_HELLO:unknown cipher returned>


Может кто-нибудь знает как заставить Питон работать с этим модифицированным OpenSSL или может есть другой способ завести Питон с поддержкой ГОСТовских алгоритмов?

Операционка: Linux Mint 17 x64
  • Вопрос задан
  • 5959 просмотров
Решения вопроса 1
@SlimHouse Автор вопроса
Сквозь тернии к звездам
В итоге, путем проб и ошибок получилось такое решение (оговорюсь, что решение можно сказать "на коленке", если кто-то предложит варианты, чтобы сделать его стабильным, то я буду за).

1. В конфиге openssl.cnf:
- в самом начале добавляем
openssl_conf = openssl_def
- в конце добавляем
[openssl_def]
engines = engine_section
[engine_section]
gost = gost_section
[gost_section]
engine_id = gost
default_algorithms = ALL

Проверяем, что все работает, командами:
openssl ciphers |tr ":" "\n" |grep GOST
openssl engine gost -t
openssl engine


2. Далее качаем исходники Python для сборки (проверено на версиях 2.7.8 и 2.7.9) и распаковываем, например:
wget https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz


3. В исходниках открываем файлик Modules/_ssl.c и делаем следующее:
- ищем инклуды:
#include <openssl/x509.h>
#include <openssl/err.h>
#include <openssl/rand.h>

после них добавляем
#include <openssl/conf.h>
- ищем функцию init_ssl. В ней перед строчками
SSL_library_init();
SSL_load_error_strings();

вставляем
OPENSSL_config(NULL);

4. Собираем Python и проверяем работу с ГОСТ.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@dosbear
Спасибо за ваше решение. Дополню его примером использования для доступа к сайтам
import ssl
import urllib2
ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
ctx.set_ciphers('GOST2001-GOST89-GOST89:GOST94-GOST89-GOST89')
print urllib2.urlopen("https://test.domain.ru/", context=ctx).read()
Без объявления контекста urllib2 у меня не заработал
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы