Python 请求将证书作为字符串发送

Python requests send certificate as string

我似乎无法让握手正常工作。

cert = 'path/to/cert_file.pem'
url = 'https://example.com/api'

requests.get(url, cert=cert, verify=True)

当我在物理上有文件的地方使用它时,这很好。 我们在 heroku 上托管我们的应用程序并使用环境变量。

请求模块似乎不接受证书作为字符串。例如。

$ export CERTIFICATE="long-list-of-characters"

requests.get(url, cert=get_env('CERTIFICATE'), verify=True)

我也试过这样的:

cert = tempfile.NamedTemporaryFile()
cert.write(CERTIFICATE)
cert.seek(0)
requests.get(url, cert=cert.name, verify=True)

首先,它可以在本地运行,但不能在 heroku 上运行。无论如何,它感觉不像是一个可靠的解决方案。 我收到 SSL 握手错误。

有什么建议吗?

根据 requests 文档:

The private key to your local certificate must be unencrypted. Currently, Requests does not support using encrypted keys.

You can [also] specify a local cert to use as client side certificate, as a single file (containing the private key and the certificate) or as a tuple of both file's path:

requests.get('https://kennethreitz.com', cert=('/path/client.cert', '/path/client.key'))

您必须包含 public 和私钥的路径...或者您可以包含包含这两者的单个文件的路径。

Vasili 的回答在技术上是正确的,但它本身并没有回答您的问题。确实,密钥文件必须首先未加密。

我自己刚刚解决了像你这样的情况。你走在正确的道路上;你所要做的就是

1.delete=False传递给NamedTemporaryFile(),这样调用close()

后文件不会被删除

2. close() 使用前的临时文件,所以会保存

请注意,这是一件非常不安全的事情。 delete=False,据我所知,导致文件即使在删除对它的引用后仍保留在磁盘上。因此,要删除文件,您应该手动调用 os.unlink(tmpfile.name).

使用证书执行此操作存在巨大的安全风险:您必须确保带有证书的字符串是安全和隐藏的,并且没有人可以访问服务器。

然而,这是一个非常有用的实践,例如,在作为测试环境的 Heroku 服务器上和在云中构建的 Docker 图像中管理您的应用程序,其中 COPY 指令不是一个选项。这也绝对比将文件存储在 git 存储库中更好 :D

这是一个老问题,但由于我在这里结束并且问题没有得到回答,我想我会指出我针对类似问题提出的解决方案,该解决方案可用于解决 OP 的问题.

这可以通过猴子补丁 requests 使用 来完成。