首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在python中使用存储在字符串变量中的证书打开ssl套接字

问如何在python中使用存储在字符串变量中的证书打开ssl套接字
EN

Stack Overflow用户
提问于 2012-09-09 11:13:41
回答 4查看 10.3K关注 0票数 26

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

如何使用从字符串变量读取的证书启动SSL连接?

我的主机环境不允许写入文件,并且tempfile模块不起作用

我使用的是Python 2.7。

我将证书存储在MySQL中,并将其作为字符串读取。

编辑:我放弃了,这基本上是要求用纯python代码实现ssl,这超出了我目前的知识范围。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-12-17 05:53:10

查看源代码,ssl.wrap_socket直接调用本机代码(openssl)函数SSL_CTX_use_cert_chain_file,该函数需要一个文件路径,因此您不可能尝试执行此操作。

供参考:

在ssl/init.py中,我们看到:

代码语言:javascript
复制
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构造函数(它在同一个文件中),我们看到发生了以下情况:

代码语言:javascript
复制
self._sslobj = _ssl2.sslwrap(self._sock, server_side,
                                     keyfile, certfile,
                                     cert_reqs, ssl_version, ca_certs)

_ssl2是用C (_ssl2.c)实现的

查看sslwrap函数,我们可以看到它正在创建一个新对象:

代码语言:javascript
复制
    return (PyObject *) newPySSLObject(Sock, key_file, cert_file,
                                       server_side, verification_mode,
                                       protocol, cacerts_file);

查看该对象的构造函数,我们最终会看到:

代码语言:javascript
复制
            ret = SSL_CTX_use_certificate_chain_file(self->ctx,
                                                     cert_file);

该函数是在openssl中定义的,所以现在我们需要切换到该代码库。

在ssl/ssl_rsa.c中,我们最终可以在函数中找到:

代码语言:javascript
复制
BIO_read_filename(in,file) 

如果你深入研究BIO代码(openssl的一部分),你最终会得到一个普通的fopen():

代码语言:javascript
复制
fp=fopen(ptr,p);

因此,它看起来像是当前编写的。它必须位于可由C的fopen()打开的文件中。

此外,由于python的ssl库如此快速地跳转到C语言中,我也看不出在解决方法中有什么明显的地方可以使用monkeypatch。

票数 28
EN

Stack Overflow用户

发布于 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,你绝对可以破解它来使用内存中的证书/密钥。

票数 5
EN

Stack Overflow用户

发布于 2018-09-25 14:21:32

在Python3.4中,您可以使用SSLContext#load_verify_locations:

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12336239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档