2014-02-01 5 views
1

Этот код не работает на моем Ubuntu, но хорошо работает на других хостах.urllib2: чтение https ошибка url

>>> from urllib2 import urlopen 
>>> urlopen("https://courtapps.utcourts.gov/XchangeWEB/login") 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen 
    return _opener.open(url, data, timeout) 
    File "/usr/lib/python2.7/urllib2.py", line 400, in open 
    response = self._open(req, data) 
    File "/usr/lib/python2.7/urllib2.py", line 418, in _open 
    '_open', req) 
    File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain 
    result = func(*args) 
    File "/usr/lib/python2.7/urllib2.py", line 1215, in https_open 
    return self.do_open(httplib.HTTPSConnection, req) 
    File "/usr/lib/python2.7/urllib2.py", line 1177, in do_open 
    raise URLError(err) 
urllib2.URLError: <urlopen error [Errno 1] _ssl.c:504: error:1408F119:SSL 
routines:SSL3_GET_RECORD:decryption failed or bad record mac> 

В чем причина и как исправить это? Я чувствую, что что-то не так с OpenSSL, установлены v1.0.1.

+0

терпит неудачу для меня также под Debian неустойчиво. Проблема, похоже, не имеет ничего общего с Python, но с базовым OpenSSL. Проверьте [здесь] (http://openssl.6102.n7.nabble.com/Fw-1-0-0e-decryption-failed-or-bad-record-mac-td46197.html), например (есть много другие хиты об этом ищут вашу конкретную ошибку). –

+2

Этот [отчет об ошибках Debian] (http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=678353) может быть связан. –

+0

@StefanoSanfilippo Disabpling AES-NI не помогает –

ответ

4

Пользовательские SSLv3 обработчик решает эту проблему:

import httplib, ssl, urllib2, socket 
class HTTPSConnectionV3(httplib.HTTPSConnection): 
    def __init__(self, *args, **kwargs): 
     httplib.HTTPSConnection.__init__(self, *args, **kwargs) 

    def connect(self): 
     sock = socket.create_connection((self.host, self.port), self.timeout) 
     if self._tunnel_host: 
      self.sock = sock 
      self._tunnel() 
     try: 
      self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, ssl_version=ssl.PROTOCOL_SSLv3) 
     except ssl.SSLError, e: 
      print("Trying SSLv3.") 
      self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, ssl_version=ssl.PROTOCOL_SSLv23) 

class HTTPSHandlerV3(urllib2.HTTPSHandler): 
    def https_open(self, req): 
     return self.do_open(HTTPSConnectionV3, req) 

# install opener 
urllib2.install_opener(urllib2.build_opener(HTTPSHandlerV3())) 

if __name__ == "__main__": 
    r = urllib2.urlopen("https://courtapps.utcourts.gov/XchangeWEB/login") 
    print(r.read()) 
Смежные вопросы