【问题标题】:SSL Context for older python version旧 python 版本的 SSL 上下文
【发布时间】:2016-07-01 19:28:42
【问题描述】:

我有如下代码:

headers = {'content-type': 'ContentType.APPLICATION_XML'}
uri = "www.client.url.com/hit-here/"
clientCert = "path/to/cert/abc.crt"
clientKey = "path/to/key/abc.key"
PROTOCOL = ssl.PROTOCOL_TLSv1
context = ssl.SSLContext(PROTOCOL)
context.load_default_certs()
context.load_cert_chain(clientCert, clientKey)
conn = httplib.HTTPSConnection(uri, some_port, context=context)

我不是真正的网络程序员,所以我在谷歌上搜索了握手连接,发现 ssl.SSLContext(PROTOCOL) 是所需的函数,代码工作正常。

然后我遇到了障碍,我的本地版本是 2.7.10,但所有生产盒都有 2.7.3,因此不支持 SSLContext 并且升级 python 版本不是一个选项/可控。

我尝试阅读ssl — SSL wrapper for socket objects,但无法理解。

我尝试了什么(徒劳):

s_ = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s = ssl.wrap_socket(s_, keyfile=clientKey, certfile=clientCert, cert_reqs=ssl.CERT_REQUIRED)
new_conn = s.connect((uri, some_port))

但返回:

SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)')

问题 - 如何在旧版本上生成 SSL Context 以实现安全的 https 连接?

【问题讨论】:

  • 我不认为旧版本可以使用上下文。您是否尝试过创建指定证书的 https 连接,即 conn = httplib.HTTPSConnection(host, port, key_file, cert_file, strict, timeout)

标签: python sockets ssl https sslcontext


【解决方案1】:

您必须指定 ca_certs 文件(应指向信任存储)

【讨论】:

  • 你能详细说明一下吗?
  • 为了信任服务器证书,您需要拥有服务器的 ca_certificate。所以你的 wrap_socket 应该像 ssl.wrap_socket(s_, keyfile=clientKey, certfile=clientCert, ca_certs=cacertfile cert_reqs=ssl.CERT_REQUIRED)
【解决方案2】:

我使用requests library 得到了完美的解决方案。 requests 库必须是我曾经使用过的最喜欢的库,因为它采用了 Python 中本来就很难做到的东西——SSL 和 REST 请求——并使它变得难以置信的简单。我检查了他们的版本支持并支持 Python 2.6+。

这是一个如何使用他们的库的示例。

>>> requests.get(uri)

这就是你所要做的。 requests 库负责建立 ssl 连接。


更进一步。如果您需要在请求之间保留 cookie,可以这样做。

>>> sess = requests.Session()
>>> credentials = {"username": "user", 
                   "password": "pass"}
>>> sess.post("https://some-website/login", params=credentials)
<Response [200]>
>>> sess.get("https://some-website/a-backend-page").text
<html> the backend page... </html>

编辑:如果需要,你也可以pass in the path to the certificate and the key 喜欢requests.get(uri, cert=('path/to/cert/abc.crt', 'path/to/key/abc.key'))


现在希望您能说服他们在生产设备上安装 requests 库,因为这非常值得。让我知道这是否适合您。

【讨论】:

  • request.get 不支持加密密钥,并且 request.post 文档没有任何证书/密钥文档...有什么想法吗?
  • 该死。好吧,我想不出任何其他方法可以做到这一点,但如果我这样做了,我会告诉你的。
猜你喜欢
  • 2014-08-11
  • 2019-09-02
  • 2012-12-15
  • 1970-01-01
  • 2023-03-22
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多