在Python,ssl.wrap_socket可以从文件中读取证书,ssl.wrap_socket需要的证书作为文件路径。
我怎样才能开始使用从字符串变量读取证书的SSL连接?
我的主机环境不允许写文件,临时文件模块不能正常工作
我使用Python 2.7。
我存储在MySQL证书,并宣读作为字符串。
编辑:我放弃了,这基本上是需要实现由纯Python代码SSL,这已经超出了我目前的知识。
在Python,ssl.wrap_socket可以从文件中读取证书,ssl.wrap_socket需要的证书作为文件路径。
我怎样才能开始使用从字符串变量读取证书的SSL连接?
我的主机环境不允许写文件,临时文件模块不能正常工作
我使用Python 2.7。
我存储在MySQL证书,并宣读作为字符串。
编辑:我放弃了,这基本上是需要实现由纯Python代码SSL,这已经超出了我目前的知识。
望着源,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,我没有看到一个显而易见的地方在一个变通方法猴补丁无论是。
快看看虽然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,你绝对可以破解它使用内存证书/密钥。
在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
你可以把像文件字符串StringIO的 。