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

Gel*_*der 11 python heroku python-requests

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

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

requests.get(url, cert=cert, verify=True)
Run Code Online (Sandbox Code Playgroud)

当我在本地使用它时,这是很好的,我在物理上有文件.我们在heroku上托管我们的应用程序并使用environvariables.

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

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

requests.get(url, cert=get_env('CERTIFICATE'), verify=True)
Run Code Online (Sandbox Code Playgroud)

我也尝试过这样的事情:

cert = tempfile.NamedTemporaryFile()
cert.write(CERTIFICATE)
cert.seek(0)
requests.get(url, cert=cert.name, verify=True)
Run Code Online (Sandbox Code Playgroud)

首先,它在本地工作,但不在heroku上工作.无论如何,它不是一个坚实的解决方案.我收到SSL握手错误.

有什么建议?

小智 6

Vasili 的回答在技术上是正确的,尽管它本身并没有回答你的问题。实际上,密钥文件一开始必须是未加密的。

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

1.传递delete=FalseNamedTemporaryFile(),调用后文件不会被删除close()

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

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

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

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


gre*_*der 4

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

requests这可以通过使用这种技术的猴子修补来完成。