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

标签 python sockets ssl certificate

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

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

我的主机环境不允许写入文件,并且 tempfile 模块不起作用
我正在使用 Python 2.7。
我将证书存储在 MySQL 中并作为字符串读取。

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

最佳答案

查看源代码,ssl.wrap_socket 直接调用 native 代码(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 中,我也没有看到一个明显的地方可以在解决方法中进行猴子补丁。

关于python - 如何使用存储在python字符串变量中的证书打开ssl套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12336239/

相关文章:

android - 无法在 android studio 中访问 OKHttp 包,但从 Okhttp 包中抛出异常?

python - 连接到本地主机上的套接字

Python 记录 : how to add a custom field to LogRecord, 并注册一个全局回调来设置它的值

python - 沿动态指定的轴切片 numpy 数组

Python Selenium WebDriver 拖放

java - 套接字超时不起作用,InputStream 读取 block

c - 无法从终端设置 Ad-hoc 网络

ssl - 通过存储与 Wireshark 一起使用的 SSL key 在 golang 中解密 TLS

objective-c - SecTrustEvaluate 没有按预期失败?

python - 当我使用 concurrent.futures 时,无法弄清楚如何将结果写回同一个工作表