2012-03-23 20 views
10

पर इस दिन का एक अच्छा हिस्सा बिताएं, और मैं अपने पर फिर से हूं समझ के परे। मेरे पास पाइथन 2.6.6/2.7.2 स्थापित के साथ 1 मशीन "ए" है, और पाइथन 2.6.7/2.7.2 के साथ एक और मशीन "बी" स्थापित है।Urllib.urlopen() 1 मशीन पर पायथन 2.6.6 के साथ SSLv3 urls पर काम करता है, लेकिन 2.67/2.7.2 के साथ अन्य

मशीन ए पर, मैं urllib2.urlopen('https://fed.princeton.edu') के साथ एक एसएसवीवी 3-एन्क्रिप्टेड वेबसाइट पाइथन 2.6.6 का उपयोग कर लेकिन 2.7.2 नहीं कर सकता।

मशीन बी पर, मुझे पाइथन संस्करण का उपयोग करके वह वेबसाइट नहीं मिल सकती है।

तक नहीं मिल सकता है, मेरा मतलब है कि मैं त्रुटि मिलती है:

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 

पहले, मैं उलझन में है कि कुछ है कि पहले के एक अजगर संस्करण पर काम करता मशीन एक पर बाद में काम नहीं करता हूँ मैं भी बहुत उलझन में हूं कि 2.6.6 पर काम करने वाला कुछ 2.6.7 पर काम नहीं करता है (हालांकि विभिन्न मशीनों पर)। यह क्यों होगा?

अब मुझे यकीन नहीं है कि पाइथन के लिए कॉन्फ़िगरेशन दोनों पर सटीक है, लेकिन import _ssl और import httplib; httplib.HTTPSConnection दोनों मशीनों पर सभी संस्करणों के लिए काम करता है। मैंने दोनों मशीनों पर curl -v https://fed.princeton.edu और openssl fed.princeton.edu:https भी कोशिश की है, और ये सभी काम कमांड करते हैं।

मैंने कुछ शोध भी किया है और How to use urllib2 to get a webpage using SSLv3 encryption पाया है जहां लेखक libCurl के लिए urllib पर छोड़ दिया गया था (मैं नहीं बल्कि तब से मैं django-cas का उपयोग कर रहा हूं, जो urllib का उपयोग करता है और मैं नहीं चाहता उस कोड के साथ बहुत मुश्किल है)।


नोट: मैं बस http://bugs.python.org/issue11220 पाया, और पिछले पोस्ट के समाधान मुझे वेबसाइट को खोलने के लिए urlopen उपयोग करने के लिए अनुमति देता है। लेकिन मैं django-cas में अपने urlopen() को हल करने के लिए उनके समाधान का उपयोग कैसे कर सकता हूं (जो urllib2.install_opener(urllib2.build_opener(HTTPSHandlerV3())) का उपयोग करना है?)?

+0

क्या दो सिस्टम पर ओपनएसएसएल के विभिन्न संस्करण हैं? – larsks

उत्तर

6

थोड़ा और प्रयोग करने के बाद मैंने अभी स्वीकार किया है कि पायथन 2.6.6 ठीक है, लेकिन 2.6.7+ में यह बग SSL123-एन्क्रिप्टेड पृष्ठों को urllib.urlopen() के माध्यम से लाने में सक्षम नहीं है।

मैंने चाल http://bugs.python.org/issue11220 पर ट्रिक का उपयोग करके मेरी समस्या हल की, और संशोधित django_cas ताकि यह सलामी बल्लेबाज urlopen() कॉल से पहले स्थापित किया गया हो।

0

आप ssl_version कीवर्ड पैरामीटर को ओवरराइड करके बंदर-पैच ssl.wrap_socket() कर सकते हैं। निम्नलिखित कोड का उपयोग किया जा सकता है। Urlopen() से पहले इसे रखो।

import ssl 
from functools import wraps 
def sslwrap(func): 
    @wraps(func) 
    def bar(*args, **kw): 
     kw['ssl_version'] = ssl.PROTOCOL_TLSv1 
     return func(*args, **kw) 
    return bar 

ssl.wrap_socket = sslwrap(ssl.wrap_socket) 

संपादित करें: मुझे लगता है कि functools.partial साकार वास्तव में एक समारोह वापस नहीं करता है के बाद से ऊपर कोड को नवीनीकृत किया है, और इस मामले में उपयुक्त नहीं होगा। चंकी जैसा दिख सकता है, उपरोक्त कोड अभी भी सबसे अच्छा समाधान है जिसे मैं अब तक जानता हूं।

+3

यह मेरे लिए काम नहीं करता है। – gozzilli

संबंधित मुद्दे

 संबंधित मुद्दे