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
使用 来完成。
我似乎无法让握手正常工作。
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
使用