在Python中,ssl.wrap_socket可以从文件中读取证书,而ssl.wrap_socket要求证书作为文件路径。
如何使用从字符串变量读取的证书启动SSL连接?
我的主机环境不允许写入文件,并且tempfile模块不起作用
我使用的是Python 2.7。
我将证书存储在MySQL中,并将其作为字符串读取。
编辑:我放弃了,这基本上是要求用纯python代码实现ssl,这超出了我目前的知识范围。
发布于 2012-12-17 05:53:10
查看源代码,ssl.wrap_socket直接调用本机代码(openssl)函数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。
发布于 2012-12-20 03:55:52
快速浏览一下ssl模块源代码,确认http://code.google.com/codesearch#2T6lfGELm_A/trunk/Modules/_ssl.c&q=sslwrap&type=cs接口不支持您想要的内容。
这并不是说这是不可能的,您可以创建一个命名管道,从Python提供一端,并将文件名提供给ssl模块。
为了更简单、更安全地使用,将cert从内存转储到mkstemp()'d文件。
您甚至可以挂载FUSE卷和截取文件回调。
最后,使用ctype在运行时破解ssl上下文,并按照C配方Read certificate files from memory instead of a file using OpenSSL从缓冲区加载cert/ket,这样的事情以前已经做过了,但它不适合胆小鬼。
看起来你正试图从应用引擎“监狱”中走出来,也许这是不可能的?
如果您对ssl实现不挑剔,您可以使用M2Crypto、TLS Lite、pyOpenSSL或其他工具。之前的版本是纯python,你绝对可以破解它来使用内存中的证书/密钥。
发布于 2018-09-25 14:21:32
在Python3.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
https://stackoverflow.com/questions/12336239
复制相似问题