Как использовать urllib2 для получения веб-страницы с использованием шифрования SSLv3 - PullRequest
4 голосов
/ 07 ноября 2011

Я использую Python 2.7, и я хотел бы получить содержимое веб-страницы, которая требует sslv3. В настоящее время, когда я пытаюсь получить доступ к странице, я получаю сообщение об ошибке SSL23_GET_SERVER_HELLO, и некоторые поиски в Интернете приводят меня к следующему решению, которое исправляет ошибки в Python 3

urllib.request.install_opener(urllib.request.build_opener(urllib.request.HTTPSHandler(context=ssl.SSLContext(ssl.PROTOCOL_TLSv1))))

Как я могу получить тот же эффект в Python 2.7, поскольку я не могу найти эквивалент аргумента контекста для класса HTTPSHandler.

Ответы [ 3 ]

2 голосов
/ 18 января 2015

Я понимаю, что этот ответ опоздал на несколько лет, но я также столкнулся с той же проблемой и не хотел зависеть от установки 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() вызове

0 голосов
/ 17 марта 2012

Так как я не смог сделать это с помощью urllib2, я в конце концов сдался и перешел на использование привязок libCurl, как @Bruno предложил в комментариях к ответу pastylegs.

0 голосов
/ 07 ноября 2011

SSL должен обрабатываться автоматически, если на вашем сервере установлены библиотеки SSL (т.е. вам не нужно специально добавлять его в качестве обработчика)

http://docs.python.org/library/urllib2.html#urllib2.build_opener

Если в установке Python есть поддержка SSL (то есть, если модуль ssl можно импортировать), HTTPSHandler также будет добавлен.

Также обратите внимание, что urllibи urllib2 были объединены в Python 3, поэтому их подход немного отличается

...