Al buscar en la fuente, ssl.wrap_socket llama directamente a la función de código nativo (openssl) SSL_CTX_use_cert_chain_file que requiere una ruta a un archivo, por lo que lo que está intentando hacer no es posible.
Como referencia:
en ssl/init .py que vemos:
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)
Puntos de Estados Unidos para el constructor SSLSocket (que está en el mismo archivo) y vemos las siguientes situaciones:
self._sslobj = _ssl2.sslwrap(self._sock, server_side,
keyfile, certfile,
cert_reqs, ssl_version, ca_certs)
_ssl2 se implementa en C (_ssl2.c)
En cuanto a la función sslwrap, vemos que está creando un nuevo objeto:
return (PyObject *) newPySSLObject(Sock, key_file, cert_file,
server_side, verification_mode,
protocol, cacerts_file);
Mirando el constructor para ese objeto, al final vemos:
ret = SSL_CTX_use_certificate_chain_file(self->ctx,
cert_file);
Esa función se define en OpenSSL, por lo ahora tenemos que cambiar a esa base de código.
en ssl/ssl_rsa.c nos encontramos finalmente en la función:
BIO_read_filename(in,file)
Si se mira lo suficientemente lejos en el código BIO (parte de OpenSSL) que finalmente va a llegar a un fopen() normal:
fp=fopen(ptr,p);
Parece que está escrito. Debe estar en un archivo que pueda abrir el fopen() de C.
Además, como la biblioteca ssl de python tan rápidamente salta en C, tampoco veo un lugar inmediatamente obvio para monkeypatch en una solución alternativa.
Seguramente su entorno host le permite almacenar certificados SSL, de alguna manera? incluso si ellos quieren suplirlos ellos mismos. – EJP
Guardé los datos del certificado en mysql. mi código necesita un socket ssl para otro host para recuperar datos. Leí el certificado de la base de datos, pero no sé cómo crear el ssl wrap. – kaala
Al buscar en la fuente, ssl.wrap_socket llama directamente a la función de código nativo (openssl) SSL_CTX_use_cert_chain_file que requiere una ruta a un archivo, por lo que lo que está intentando hacer no es posible. Necesita escribir el certificado en un archivo para que esto funcione. – cnelson