2015-12-30 4 views
3

Я пытаюсь использовать urllib для Python, чтобы открыть URL-адрес, но я получаю сообщение об ошибке с одним конкретным URL-адресом, который выглядит нормально по сравнению с другими, а также хорошо работает в браузере.Ошибка urllib2 Python. SSL: TLSV1_ALERT_INTERNAL_ERROR ssl.c: 590

код, который генерирует ошибку является:

import cStringIO 
import imghdr 
import urllib2 
response = urllib2.urlopen('https://news.artnet.com/wp-content/news-upload/2015/08/Brad_Pitt_Fury_2014-e1440597554269.jpg') 

Однако, если я сделать то же самое с подобной URL я не получаю сообщение об ошибке:

import cStringIO 
import imghdr 
import urllib2 
response = urllib2.urlopen('https://upload.wikimedia.org/wikipedia/commons/d/d4/Brad_Pitt_June_2014_(cropped).jpg') 

я ошибка получить в первом примере:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 154, in urlopen 
    return opener.open(url, data, timeout) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 431, in open 
    response = self._open(req, data) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 449, in _open 
    '_open', req) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 409, in _call_chain 
    result = func(*args) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1240, in https_open 
    context=self._context) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1197, in do_open 
    raise URLError(err) 
urllib2.URLError: <urlopen error [SSL: TLSV1_ALERT_INTERNAL_ERROR] tlsv1 alert internal error (_ssl.c:590)> 
+0

Вы были в состоянии решить эту проблему? Я также испытываю такую ​​же проблему при доступе к URL-адресу. – abhinav

ответ

1

Я нашел очень хорошее объяснение в документации по urllib3.

Следующий код был решен вопрос с Python 2.7.10:

import urllib3 
import ssl 
import certifi 
urllib3.contrib.pyopenssl.inject_into_urllib3() 

# Open connection 
http = urllib3.PoolManager(
    cert_reqs='CERT_REQUIRED', # Force certificate check. 
    ca_certs=certifi.where(), # Path to the Certifi bundle. 
) 

# Make verified HTTPS requests. 
try: 
    resp = http.request('GET', url_photo) 
except urllib3.exceptions.SSLError as e: 
    # Handle incorrect certificate error. 
    print "error with https certificates" 
+2

Помогите со ссылкой на объяснение? – fullerja

2

Это сайт с помощью SSL Cloudflare и нуждается в Server Name Indication (SNI). Без доступа SNI к этому сайту будет показано поведение, которое вы можете увидеть здесь, т. Е. Запустить оповещение tlsv1. SNI был добавлен в Python 2.7 только с 2.7.9, и вы, вероятно, используете более старую версию Python.

+1

Моя версия Python выглядит как 2.7.10: Python 2.7.10 (v2.7.10: 15c95b7d81dc, 23 мая 2015, 09:33:12) [GCC 4.2.1 (Apple Inc. build 5666) (точка 3) ] on darwin – user2348684

+0

@ user2348684: возможно, у urllib2 пока нет поддержки SNI (SNI должно быть явно использовано библиотекой). Лучше попробуйте запросы, которые обязательно должны иметь поддержку. –

Смежные вопросы