Python请求将证书作为字符串

时间:2015-06-02 14:28:42

标签: python heroku python-requests

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

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

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

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

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

$ 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握手错误。

有什么建议吗?

3 个答案:

答案 0 :(得分:3)

这是一个古老的问题,但是由于我在这里结束并没有回答该问题,所以我想指出我想出的类似问题的解决方案,该问题可用于解决OP的问题。 / p>

这可以通过使用this technique修补猴子requests来完成。

答案 1 :(得分:2)

瓦西里的回答在技术上是正确的,但本身并没有回答你的问题。实际上,密钥文件必须是未加密的。

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

1。TreeMap传递给delete=False,因此在调用NamedTemporaryFile()后不会删除该文件

使用前的

2。 close()临时文件,因此会保存

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

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

然而,例如,在作为测试环境的Heroku服务器和在云中构建的Docker镜像中管理您的应用程序是非常有用的做法,其中os.unlink(tmpfile.name)指令不是选项。它也绝对比将文件存储在您的git存储库中更好:D

答案 2 :(得分:1)

根据requests文档:

  

本地证书的私钥必须未加密。目前,请求不支持使用加密密钥。

     

您还可以[还]将本地证书指定为客户端证书,单个文件(包含私钥和证书)或文件路径的元组:

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

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