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



