我正在使用python请求模块进行POST调用:
import requests
response = requests.post( foo_url,
json={"foo":"bar"},
headers=foo_headers,
verify='/path/to/cert' )
这很好。虽然可以直接使用证书的值而不是包含证书的文件的路径吗?
答案 0 :(得分:1)
TLDR:答案是肯定的“不,证书必须必须在磁盘上的文件中。”原因是因为OpenSSL太糟糕了。
requests
基于urllib3
,后者基于ssl
。 requests
接受顶级cert
参数并将其拆分为名为cert_file
和key_file
的参数,这些参数将传递给urllib3
。 urllib3
将它们原封不动地传递到ssl
。 ssl
希望它们是文件名。
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
不使用它们。