7

我想选择用于在 Python 2.7 中使用 urllib2.urlopen() 打开 https 链接的传输层协议

类似于我们可以使用 openssl 实用程序执行的操作:

openssl s_client -connect www.google.com:443 -ssl2
openssl s_client -connect www.google.com:443 -ssl3
openssl s_client -connect www.google.com:443 -tls1

动机是不使用 ssl2 协议,该协议会导致大多数服务器出现握手问题。urllib2 似乎使用 SSLv23 协议,该协议使用 SSLv2 或 SSLv3 并具有某种机制的下降。在某些情况下,这会导致握手问题

4

1 回答 1

10

更新: 从 Python 2.7.9 开始,您可以通过 SSLContext 指定 TLS 协议urlopen()运行:

import ssl
import urllib2

context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
# other settings (see ssl.create_default_context() implementation)
urllib2.urlopen('https://example.com', context=context).close()

旧答案:

httplib.HTTPSConnection并且urllib2.HTTPSHandler不允许更改 ssl 版本,但 ssl.wrap_socket()确实如此。

您可以定义自己的HTTPSHandler,允许您将任意参数传递给ssl.wrap_socket()例如urllib2_ssl.py

>>> import ssl
>>> import urllib2
>>> import urllib2_ssl # https://gist.github.com/zed/1347055
>>> opener = urllib2.build_opener(urllib2_ssl.HTTPSHandler(
...     ssl_version=ssl.PROTOCOL_TLSv1, #XXX you need to modify urllib2_ssl
...     ca_certs='cacert.pem')) # http://curl.haxx.se/ca/cacert.pem.bz2
>>> opener.open('https://example.com/').read()
于 2014-03-28T18:21:45.080 回答