Ответ 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 в обходном пути.