Я понимаю, что этот ответ опоздал на несколько лет, но я также столкнулся с той же проблемой и не хотел зависеть от установки libcurl на машине, где я его запускал.Надеюсь, это будет полезно для тех, кто найдет этот пост в будущем.
Проблема в том, что httplib.HTTPSConnection.connect
не может указать контекст или версию SSL.Вы можете перезаписать эту функцию до того, как быстро достигнете сути своего сценария для быстрого решения.
Важным соображением является то, что этот обходной путь, как обсуждалось выше, не будет проверять действительность сертификата сервера.
import httplib
import socket
import ssl
import urllib2
def connect(self):
"Connect to a host on a given (SSL) port."
sock = socket.create_connection((self.host, self.port),
self.timeout, self.source_address)
if self._tunnel_host:
self.sock = sock
self._tunnel()
self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, ssl_version=ssl.PROTOCOL_TLSv1)
httplib.HTTPSConnection.connect = connect
opener = urllib2.build_opener()
f = opener.open('https://www.google.com/')
* Примечание: эта альтернативная функция connect()
была скопирована / вставлена из httplib.py и просто изменена для указания ssl_version
в wrap_socket()
вызове