Python 请求使用证书值而不是路径

2024-03-18

我正在使用 python 请求模块进行 POST 调用:

import requests
response = requests.post( foo_url, 
                          json={"foo":"bar"}, 
                          headers=foo_headers,
                          verify='/path/to/cert' )

这很好用。虽然可以直接使用证书的值而不是包含证书的文件的路径吗?


TLDR:答案肯定是“不,证书must位于磁盘上的文件中。” 原因是 OpenSSL 很糟糕。

requests是基于urllib3,这是基于ssl. requests占据你的顶级cert参数并将其分成名为的参数cert_file and key_file,它被传递给urllib3. urllib3将它们原封不动地传递给ssl. And ssl期望它们是文件名。

Python 堆栈底部的具体罪魁祸首是SSLContext.load_cert_chain https://docs.python.org/3/library/ssl.html#ssl.SSLContext.load_cert_chain来自ssl模块。这取决于_SSLContext,它是用 C 编写的。C 代码为_SSLContext.load_cert_chain is here https://github.com/python/cpython/blob/18b711c5a7f90d88fb74748f18fa8ef49d8486c7/Modules/_ssl.c#L3891-L3912。您可以看到,它确实 100% 需要文件系统路径!啊!

C 堆栈底部的罪魁祸首是 OpenSSLSSL_CTX_use_certificate_chain_file https://www.openssl.org/docs/man1.0.2/man3/SSL_CTX_use_certificate_chain_file.html,它有这个签名:

int SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file);

在 OpenSSL 中构建证书链的方法有很多,不涉及“仅打开文件并读入”,但它们要复杂得多,我想这就是 Python 的原因ssl不使用它们......这解释了为什么urllib3不使用它们,这解释了为什么requests不使用它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 请求使用证书值而不是路径 的相关文章

随机推荐