如何打开使用证书SSL套接字存储在Python字符串变量(How to open ssl socke

2019-06-18 02:14发布

在Python,ssl.wrap_socket可以从文件中读取证书,ssl.wrap_socket需要的证书作为文件路径。

我怎样才能开始使用从字符串变量读取证书的SSL连接?

我的主机环境不允许写文件,临时文件模块不能正常工作
我使用Python 2.7。
我存储在MySQL证书,并宣读作为字符串。

编辑:我放弃了,这基本上是需要实现由纯Python代码SSL,这已经超出了我目前的知识。

Answer 1:

望着源,ssl.wrap_socket直接调用到本机代码(OpenSSL的)功能SSL_CTX_use_cert_chain_file这需要一个文件的路径,所以你正在尝试做的是不可能的。

以供参考:

在SSL / 初始化的.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打开一个文件()。

此外,由于蟒蛇的SSL库,以便迅速跳入C,我没有看到一个显而易见的地方在一个变通方法猴补丁无论是。



Answer 2:

快看看虽然SSL模块源确认你想不被支持的API是什么: http://code.google.com/codesearch#2T6lfGELm_A/trunk/Modules/_ssl.c&q=sslwrap&type=cs

这并不是说这是不可能的,你可以创建一个命名管道,进给量从Python的一端,并给文件名到SSL模块。

对于更简单,更安全的使用,转储从内存证书到mkstemp()'d文件。

你甚至可以安装保险丝容量和拦截文件回调。

最后,使用ctypes的在距一个缓冲运行和负载CERT / KET SSL环境下的C配方破解从内存而不是使用OpenSSL文件中读取证书文件之类的东西,这些都做过,但它不是为微弱的心脏的。

它看起来像你正试图摆脱如应用程序引擎的“监狱”,也许它仅仅是不可能的?

如果你不是在SSL实现挑剔,你可以使用M2Crypto,TLS精简版,pyOpenSSL或别的东西。 早期是纯Python,你绝对可以破解它使用内存证书/密钥。



Answer 3:

在Python 3.4,你可以使用的SSLContext#load_verify_locations:

context = ssl.SSLContext()
context.load_verify_locations(cadata=cert)  # Where cert is str.

从https://docs.python.org/3/library/ssl.html#ssl.SSLContext.load_verify_locations



Answer 4:

你可以把像文件字符串StringIO的 。



文章来源: How to open ssl socket using certificate stored in string variables in python