我有一个代码如下:
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 包装器,但无法理解它。
我尝试过(徒劳):
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上下文以建立安全的https连接?
指定ca_certs文件(应指向信任存储)
我使用请求库得到了完美的解决方案。请求库必须是我用过的最喜欢的库,因为它在Python中采用了一些本质上很难做到的东西 - SSL和REST请求 - 并且使它变得非常简单。我查看了他们的版本支持,并支持Python 2.6+。
以下是如何使用其库的示例。
>>> requests.get(uri)
这就是你所要做的。请求库负责建立 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>
编辑:如果需要,您还可以传入证书和密钥的路径,如下所示requests.get(uri, cert=('path/to/cert/abc.crt', 'path/to/key/abc.key'))
现在希望你能说服他们在生产盒上安装请求库,因为这是非常值得的。让我知道这是否适合您。