当前位置: 首页 > 面试题库 >

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

司寇凯
2023-03-14
问题内容

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

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

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

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


问题答案:

查看源代码,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语言,因此在变通方法中,我也看不到立即出现猴子补丁的地方。



 类似资料:
  • 问题内容: 我正在尝试在Python中建立安全的套接字连接,而使用SSL有点麻烦。我已经找到一些有关如何与SSL建立连接的代码示例,但它们都涉及密钥文件。我尝试连接的服务器不需要接收任何密钥或证书。我的问题是,我该如何实质上包装带有SSL的python套接字连接。我知道我应该使用的密码是,协议是。这就是我一直在尝试的: 运行此代码时,没有任何错误,但响应为空。当尝试在命令行中调试此代码时,通过在终

  • 问题内容: 我需要能够调用一个函数,但是函数名称存储在变量中,这可能吗?例如: 问题答案: 要么

  • 问题内容: 我要在主题中包含文件名“ main.txt”,因为我是从命令行传递文件名的。但是这样做会出错 问题答案: 我猜您打算这样做:

  • 问题内容: 我想int放入一个。这是我目前正在做的事情: 我必须为几个不同的数字运行程序,所以我想做一个循环。但是像这样插入变量不起作用: 如何在字符串中插入变量? 问题答案: 当跟随字符串时,%运算符允许你通过格式代码(在本例中为%d)将值插入该字符串。有关详细信息,请参阅Python文档:

  • 问题内容: 我正在创建一个Go TCP服务器(不是http / s),并且试图将其配置为使用SSL。我有一个StartCom免费SSL证书,正试图用来完成此任务。我的服务器代码如下: 我尝试切换证书的顺序,但不包括某些证书等,但是的输出基本上保持不变。有关完整输出,请参见此处。我对中间证书似乎做错了,但是我不知道该怎么办。我已经为此工作了几天,进行了大量的谷歌搜索和搜索,但似乎没有什么适合我的情况

  • 我正在使用python计算如果一个孩子每7秒出生一次,5年内会有多少个孩子出生。问题在我的最后一行。当我将文本打印到变量的任一侧时,如何使变量工作? 这是我的密码: