发布网友 发布时间:2022-03-03 13:34
共1个回答
热心网友 时间:2022-03-03 15:04
查看源代码,ssl.wrap_socket直接调用本地代码(openssl)函数SSL_CTX_use_cert_chain_file,它需要一个文件的路径,因此您无法做的是尝试做的。
参考:
在ssl / init .py中,我们看到:
def wrap_socket(sock,keyfile =无,certfile =无,
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的地方。