我似乎无法使握手正常工作。
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握手错误。
有什么建议吗?
答案 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'))
您必须包含公钥和私钥的路径...或者您可以包含包含两者的单个文件的路径。