Потратил на это большую часть дня, и я по-настоящему нахожусь в конце. У меня есть 1 машина "A" с установленным Python 2.6.6 / 2.7.2, и другой компьютер "B" с установленным Python 2.6.7 / 2.7.2.
На машине A я могу получить веб-сайт с шифрованием SSLv3 с urllib2.urlopen('https://fed.princeton.edu')
, используя Python 2.6.6, но не 2.7.2.
На компьютере B я не могу получить этот веб-сайт с использованием любой версии Python.
Не могу получить, я имею в виду, что я получаю ошибку:
Traceback:
File "/usr/local/lib/python2.7/dist-packages/Django-1.3.1-py2.7.egg/django/core/handlers/base.py" in get_response
111. response = callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.7/dist-packages/django_cas-2.0.3-py2.7.egg/django_cas/views.py" in login
78. user = auth.authenticate(ticket=ticket, service=service)
File "/usr/local/lib/python2.7/dist-packages/Django-1.3.1-py2.7.egg/django/contrib/auth/__init__.py" in authenticate
55. user = backend.authenticate(**credentials)
File "/usr/local/lib/python2.7/dist-packages/django_cas-2.0.3-py2.7.egg/django_cas/backends.py" in authenticate
72. username = _verify(ticket, service)
File "/usr/local/lib/python2.7/dist-packages/django_cas-2.0.3-py2.7.egg/django_cas/backends.py" in _verify_cas2
46. page = urlopen(url)
File "/usr/lib/python2.7/urllib.py" in urlopen
84. return opener.open(url)
File "/usr/lib/python2.7/urllib.py" in open
205. return getattr(self, name)(url)
File "/usr/lib/python2.7/urllib.py" in open_https
435. h.endheaders(data)
File "/usr/lib/python2.7/httplib.py" in endheaders
954. self._send_output(message_body)
File "/usr/lib/python2.7/httplib.py" in _send_output
814. self.send(msg)
File "/usr/lib/python2.7/httplib.py" in send
776. self.connect()
File "/usr/lib/python2.7/httplib.py" in connect
1161. self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file)
File "/usr/lib/python2.7/ssl.py" in wrap_socket
372. ciphers=ciphers)
File "/usr/lib/python2.7/ssl.py" in __init__
134. self.do_handshake()
File "/usr/lib/python2.7/ssl.py" in do_handshake
296. self._sslobj.do_handshake()
Exception Type: IOError at /login
Exception Value: [Errno socket error] [Errno 1] _ssl.c:503: error:140773F2:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert unexpected message
Во-первых, я запутался в том, что что-то, что работает в более ранней версии Python, не работает на более поздней на Машине А. Я также очень растерян, что что-то, что работает в 2.6.6, не работает в 2.6. 7 (правда, на разных машинах). С чего бы это?
Теперь я не уверен, что конфигурация для Python одинакова на обоих, но import _ssl
и import httplib; httplib.HTTPSConnection
работают для всех версий на обеих машинах. Я также пробовал curl -v https://fed.princeton.edu
и openssl fed.princeton.edu:https
на обеих машинах, и все эти команды работают.
Я также провел некоторое исследование и обнаружил Как использовать urllib2 для получения веб-страницы с использованием шифрования SSLv3 , где автор, похоже, отказался от urllib для libCurl (я бы предпочел этого не делать, поскольку я ' я использую django-cas, который использует urllib, и я не хочу слишком много возиться с этим кодом).
Примечание : Я только что нашел http://bugs.python.org/issue11220,, и решение последнего поста позволяет мне использовать urlopen для открытия сайта. Но как я могу использовать их решение (которое, похоже, использует urllib2.install_opener(urllib2.build_opener(HTTPSHandlerV3()))
?) Для разрешения функции urlopen () в django-cas?