Подтвердить что ты не робот

Как открыть ssl-сокет, используя сертификат, хранящийся в строковых переменных в python

В Python ssl.wrap_socket может считывать сертификаты из файлов, ssl.wrap_socket требует сертификата как путь к файлу.

Как я могу запустить SSL-соединение, используя сертификат, читаемый из строковых переменных?

Моя среда хоста не позволяет записывать файлы, а модуль tempfile не работает
Я использую Python 2.7.
Я храню сертификат внутри MySQL и читаю как строку.

Изменить: Я отказался, это в основном требует реализации ssl чистым кодом python, это выходит за рамки моих текущих знаний.

4b9b3361

Ответ 1

Рассматривая исходный код, ssl.wrap_socket вызывает непосредственно в свойстве native (opensl) функцию SSL_CTX_use_cert_chain_file, которая требует пути к файлу, поэтому то, что вы пытаетесь сделать, невозможно.

Для справки:

В ssl/ init.py мы видим:

def wrap_socket(sock, keyfile=None, certfile=None,
                server_side=False, cert_reqs=CERT_NONE,
                ssl_version=PROTOCOL_SSLv23, ca_certs=None,
                do_handshake_on_connect=True):

    return SSLSocket(sock, keyfile=keyfile, certfile=certfile,
                   server_side=server_side, cert_reqs=cert_reqs,
                   ssl_version=ssl_version, ca_certs=ca_certs,
                   do_handshake_on_connect=do_handshake_on_connect)

Указывает на конструктор SSLSocket (который находится в том же файле), и мы видим следующее:

self._sslobj = _ssl2.sslwrap(self._sock, server_side,
                                     keyfile, certfile,
                                     cert_reqs, ssl_version, ca_certs)

_ssl2 реализован в C (_ssl2.c)

Посмотрев на функцию sslwrap, мы видим, что она создает новый объект:

    return (PyObject *) newPySSLObject(Sock, key_file, cert_file,
                                       server_side, verification_mode,
                                       protocol, cacerts_file);

Посмотрев на конструктор для этого объекта, мы в итоге видим:

            ret = SSL_CTX_use_certificate_chain_file(self->ctx,
                                                     cert_file);

Эта функция определена в openssl, поэтому теперь нам нужно переключиться на эту кодовую базу.

В ssl/ssl_rsa.c мы, в конце концов, находим в функции:

BIO_read_filename(in,file) 

Если вы копаете достаточно далеко в BIO-коде (часть openssl), вы в конечном итоге придете к нормальному fopen():

fp=fopen(ptr,p);

Итак, похоже, что в настоящее время написано. Он должен находиться в файле, открытом C fopen().

Кроме того, поскольку библиотека python ssl так быстро перескакивает на C, я не вижу сразу очевидного места для monkeypatch в обходном пути.

Ответ 2

Быстрый просмотр, хотя источник модуля ssl подтверждает, что вы не поддерживаете API: http://code.google.com/codesearch#2T6lfGELm_A/trunk/Modules/_ssl.c&q=sslwrap&type=cs

Нельзя сказать, что это невозможно, вы можете создать именованный канал, подать один конец из Python и передать имя файла в модуль ssl.

Для более простого и менее безопасного использования дамп-сертификат из памяти в файл mkstemp() 'd.

Вы даже можете установить громкость FUSE и перехватить обратный вызов файла.

Наконец, используйте ctypes для взлома в контексте ssl во время выполнения и загрузки cert/ket из буфера после рецепта C Прочитайте файлы сертификатов из памяти вместо файла с использованием OpenSSL Такие вещи были сделаны раньше, но это не для слабого сердца.

Похоже, вы пытаетесь выбраться из, например. app engine "jail", возможно, это просто невозможно?

Если вы не придирчивы к реализации ssl, вы можете использовать M2Crypto, TLS Lite, pyOpenSSL или что-то еще. Раньше был чистым python, вы можете определенно взломать его для использования сертификатов/ключей в памяти.

Ответ 3

Вы можете обрабатывать строки, подобные файлам StringIO.