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

时间:2019-03-17 04:16:54

标签: python-3.x python-requests certificate

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

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

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

1 个答案:

答案 0 :(得分:1)

TLDR:答案是肯定的“不,证书必须必须在磁盘上的文件中。”原因是因为OpenSSL太糟糕了。

requests基于urllib3,后者基于sslrequests接受顶级cert参数并将其拆分为名为cert_filekey_file的参数,这些参数将传递给urllib3urllib3将它们原封不动地传递到sslssl希望它们是文件名。

Python栈底部的罪魁祸首是ssl模块中的SSLContext.load_cert_chain。它取决于用C编写的_SSLContext_SSLContext.load_cert_chain的C代码是here。您会看到,确实100%确实需要文件系统路径! gh!

C堆栈底部的罪魁祸首是OpenSSL的SSL_CTX_use_certificate_chain_file,它具有以下签名:

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

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