ошибка urllib и "SSL: ошибка проверки сертификата"
Я получаю следующую ошибку:
Exception in thread Thread-3:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 810, in __bootstrap_inner
self.run()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 763, in run
self.__target(*self.__args, **self.__kwargs)
File "/Users/Matthew/Desktop/Skypebot 2.0/bot.py", line 271, in process
info = urllib2.urlopen(req).read()
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)
URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)>
это код, который вызывает эту ошибку:
if input.startswith("!web"):
input = input.replace("!web ", "")
url = "https://domainsearch.p.mashape.com/index.php?name=" + input
req = urllib2.Request(url, headers={ 'X-Mashape-Key': 'XXXXXXXXXXXXXXXXXXXX' })
info = urllib2.urlopen(req).read()
Message.Chat.SendMessage ("" + info)
API, который я использую, требует, чтобы я использовал HTTPS. Как я могу сделать это в обход проверки?
24 ответов:
если вы просто хотите обойти проверку, вы можете создать новый SSLContext. По умолчанию вновь созданные контексты используют CERT_NONE.
будьте осторожны с этим, как указано в разделе 17.3.7.2.1
при непосредственном вызове конструктора SSLContext значение по умолчанию-CERT_NONE. Поскольку он не аутентифицирует другой узел, он может быть небезопасным, особенно в режиме клиента, где большую часть времени вы бы например, чтобы убедиться в подлинности сервера, с которым вы разговариваете. Поэтому, когда в режиме клиента, настоятельно рекомендуется использовать CERT_REQUIRED.
но если вы просто хотите, чтобы он работал сейчас по какой-то другой причине, вы можете сделать следующее, вам придется
import sslа также:input = input.replace("!web ", "") url = "https://domainsearch.p.mashape.com/index.php?name=" + input req = urllib2.Request(url, headers={ 'X-Mashape-Key': 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' }) gcontext = ssl.SSLContext(ssl.PROTOCOL_TLSv1) # Only for gangstars info = urllib2.urlopen(req, context=gcontext).read() Message.Chat.SendMessage ("" + info)Это должно обойти вашу проблему, но вы на самом деле не решаете ни одну из проблем, но вы не увидите
[SSL: CERTIFICATE_VERIFY_FAILED]потому что теперь вы не проверяете сертификат!To добавьте к вышесказанному, если вы хотите узнать больше о том, почему вы видите эти проблемы, вы захотите взглянуть на PEP 476.
этот PEP предлагает включить проверку подписей сертификатов X509, а также проверку имени хоста для HTTP-клиентов Python по умолчанию, при условии отказа от каждого вызова. Это изменение будет применено к Python 2.7, Python 3.4 и Python 3.5.
есть рекомендуется отказаться, не несходно с моим советом выше:
import ssl # This restores the same behavior as before. context = ssl._create_unverified_context() urllib.urlopen("https://no-valid-cert", context=context)Он также имеет рекомендуется через monkeypatching который вы не часто видите в python:
import ssl ssl._create_default_https_context = ssl._create_unverified_contextкоторый переопределяет функцию по умолчанию для создания контекста с помощью функции для создания непроверенного контекста.
если вы хотите прочитать статью о том, почему не проверка сертификатов плохо в программном обеспечении вы можете найти его здесь!
это не решение вашей конкретной проблемы, но я помещаю его здесь, потому что этот поток является лучшим результатом Google для "SSL: CERTIFICATE_VERIFY_FAILED", и это приводит меня к дикой погоне.
если вы установили Python 3.6 на OSX и получаете ошибку "SSL: CERTIFICATE_VERIFY_FAILED" при попытке подключиться к сайту https://, это, вероятно, потому, что Python 3.6 на OSX вообще не имеет сертификатов и не может проверить какие-либо соединения SSL. Это изменение 3.6 на OSX, и требуется шаг после установки, который устанавливает сертификаты. Это задокументировано в ReadMe, который вы должны найти в
/Applications/Python\ 3.6/ReadMe.rtfReadMe заставит вас запустить этот скрипт после установки, который просто устанавливает
certifi:/Applications/Python\ 3.6/Install\ Certificates.commandпримечания к выпуску имеют дополнительную информацию:https://www.python.org/downloads/release/python-360/
чтобы расширить ответ Крейга Гленни (извините, недостаточно репутации для комментариев):
в Python 3.6.1 на MacOs Sierra
ввод этого в терминал bash решил проблему:
pip install certifi /Applications/Python\ 3.6/Install\ Certificates.command
В Windows Python не смотрит на системный сертификат, он использует свой собственный, расположенный по адресу
?\lib\site-packages\certifi\cacert.pem.решение проблемы:
- загрузите сертификат проверки домена как *.crt или * PEM file
- открыть файл в редакторе и скопируйте его содержимое в буфер обмена
- найти
cacert.pemlocation:from requests.utils import DEFAULT_CA_BUNDLE_PATH; print(DEFAULT_CA_BUNDLE_PATH)- редактировать
cacert.pemфайл и вставьте сертификат проверки домена в конце файл.- сохраните файл и наслаждайтесь запросы!
вы можете попробовать добавить это в переменные среды:
PYTHONHTTPSVERIFY=0обратите внимание, что это приведет к отключению все проверка HTTP, так что это немного кувалдой подхода, однако если проверка не требуется, это может быть эффективным решением.
мое решение для Mac OS X:
1) обновление до Python 3.6.5 с помощью собственного приложения Python installer загруженного с официального сайта языка Pythonhttps://www.python.org/downloads/
Я обнаружил, что этот установщик заботится об обновлении ссылок и символических ссылок для нового Python намного лучше, чем homebrew.
2) установить новый сертификат с помощью "./установить сертификат.команда", которая находится в обновленном Python 3.6 каталог
> cd "/Applications/Python 3.6/" > sudo "./Install Certificates.command"
import requests requests.packages.urllib3.disable_warnings() import ssl try: _create_unverified_https_context = ssl._create_unverified_context except AttributeError: # Legacy Python that doesn't verify HTTPS certificates by default pass else: # Handle target environment that doesn't support HTTPS verification ssl._create_default_https_context = _create_unverified_https_contextВзято отсюда https://gist.github.com/michaelrice/a6794a017e349fc65d01
Как я уже писал в комментарии, эта проблема, вероятно, связана с это так ответ.
короче говоря: существует несколько способов проверки сертификата. Проверка, используемая OpenSSL, несовместима с доверенными корневыми сертификатами, которые есть в вашей системе. OpenSSL используется Python.
вы можете попытаться получить недостающий сертификат для Verisign Class 3 Public Primary Certification Authority и затем использовать согласно документация Python:
urllib2.urlopen(req, cafile="verisign.pem")
у меня была аналогичная проблема, хотя я использовал
urllib.request.urlopenна в Python 3.4, 3.5 и 3.6. (Это часть Python 3 эквивалентurllib2, в примечании во главе Python 2'surllib2страница документация.)мое решение было
pip install certifiустановитьcertifi, который имеет:... тщательно отобранная коллекция корневых сертификатов для проверки надежности SSL сертификаты при проверке подлинности узлов TLS.
затем, в моем коде, где я ранее просто имел:
import urllib.request as urlrq resp = urlrq.urlopen('https://foo.com/bar/baz.html')Я пересмотрел его:
import urllib.request as urlrq import certifi resp = urlrq.urlopen('https://foo.com/bar/baz.html', cafile=certifi.where())если я читаю
urllib2.urlopenдокументация правильно, он также имеет
на Python 3.4+ on Centos 6/7, Fedora, просто установите доверенный CA таким образом:
- скопируйте CA.ЭЛТ до
/etc/pki/ca-trust/source/anchors/update-ca-trust force-enableupdate-ca-trust extract
Я опускаю голову в полу-стыд, так как у меня была та же проблема, за исключением того, что в моем случае URL, который я ударил, был действителен, сертификат был действителен. То, что не было действительным, было моим подключением к сети. Я не смог добавить данные прокси в браузер (т. е. в этом случае). Это остановило процесс проверки от правильного выполнения.
Добавил в детали прокси и мой питон был тогда очень доволен .
как и вы, я использую python 2.7 на моем старом iMac (OS X 10.6.8), я тоже столкнулся с проблемой, используя urllib2.urlоткрыть :
urlopen error [SSL: CERTIFICATE_VERIFY_FAILED]мои программы работали нормально без проблем с сертификатом SSL и suddently (после загрузки программ) они разбились с этой ошибкой SSL.
проблема была версия python используется:
нет проблем с https://www.python.org/downloads и питон-2.7.9-macosx10.6.pkg
проблема с тем, который установлен инструмент доморощенного : "brew install python", версия, расположенная в /usr/local/bin.
глава, называется
Certificate verification and OpenSSL [CHANGED for Python 2.7.9], in/Applications/Python 2.7/ReadMe.rtfобъясняет проблему со многими деталями.Итак, проверьте, загрузите и поместите на свой путь правильную версию python.
Я удивлен, что все эти инструкции не решили мою проблему. Тем не менее, диагностика правильная (кстати, я использую Mac и Python3.6.1). Итак, подведем итог правильной части:
- на Mac Apple сбрасывает OpenSSL
- Python теперь использует собственный набор корневых сертификатов CA
- Binary Python installation предоставил скрипт для установки корневого сертификата CA, необходимого Python ("/Applications / Python 3.6 / Install Сертификаты.команда")
- Read " / Applications/Python 3.6 / ReadMe.РТФ" подробности
для меня скрипт не работает, и все эти установки certifi и openssl тоже не удалось исправить. Может быть, потому что у меня есть несколько установок python 2 и 3, а также много virtualenv. В конце концов, мне нужно исправить его вручную.
pip install certifi # for your virtualenv mkdir -p /Library/Frameworks/Python.framework/Versions/3.6/etc/openssl cp -a <your virtualenv>/site-package/certifi/cacert.pem \ /Library/Frameworks/Python.framework/Versions/3.6/etc/openssl/cert.pemЕсли это не вы. Затем повторно установите OpenSSL.
port install openssl
Мне нужно добавить еще один ответ, потому что, как и Крейг Гленни, я отправился в погоню за диким гусем из-за многих сообщений, касающихся этой проблемы в Интернете.
Я использую MacPorts, и то, что я изначально думал, было проблемой Python, на самом деле было проблемой MacPorts: он не устанавливает корневой сертификат с его установкой openssl. Решение заключается в
port install curl-ca-bundle, Как указано в этот блог.
посмотри
/ Applications / Python 3.6 / Install Certificates.команда
вы также можете перейти к приложениям и нажать на сертификаты.команда
Если ваш на vCenter 6, Вы должны вместо этого добавить сертификат центра сертификации vmware вашего vCenter в список доверенных CA вашей ОС. чтобы загрузить Ваш сертификат, выполните следующие действия
- откройте веб-браузер.
- перейдите к https://
- в правом нижнем углу щелкните ссылку Загрузить доверенный корневой ЦС
В Fedora
- распакуйте и измените расширение .От 0 до .cer
- скопируйте его в /etc/pki / ca-trust / source / anchors/
- выполните команду update-ca-trust.
ссылки:
Python 2.7.12 (по умолчанию, 29 июля 2016, 15:26:22) исправлена указанная проблема. Эта информация может помочь кому-то еще.
установка шагов для nltk (у меня был python3 (3.6.2) установлен уже в MAC OS X
sudo easy_install pipиспользуйте опцию игнорировать установленную, чтобы игнорировать удаление предыдущей версии six, иначе она дает ошибку при удалении и не переадресовывает фильм
sudo pip3 install -U nltk --ignore-installed sixПроверьте установку pip и python, используйте' 3 ' версии
which python python2 python3 which pip pip2 pip3проверьте, установлен ли NLTK
python3 import nltk nltk.__path__ ['/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/nltk']установите сертификат SSL перед установкой книги примеров, в противном случае мы будем сертификат ошибки при установке примеров
/Applications/Python\ 3.6/Install\ Certificates.command python3 -m nltk.downloader bookкоторый успешно завершил установку nltk и nltk_ata для книжных примеров
установка
PyOpenSSLС помощьюpipработал для меня (без преобразования в PEM):pip install PyOpenSSL
Я решил эту проблему, закрыв Fiddler (прокси-сервер отладки HTTP) проверьте, включен ли у вас прокси-сервер, и повторите попытку.
Python 2.7 на Amazon EC2 с centOS 7
Я должен был установить переменную env
SSL_CERT_DIRдляca-bundleкоторый был расположен в/etc/ssl/certs/ca-bundle.crt
в python 2.7 добавление сведений о доверенном корневом ЦС в конце файла C:\Python27\lib\site-packages\certifi\cacert.Пем помог
после этого я запустил (используя права администратора) типун установки --доверенный хост pypi.python.org --надежного хозяина pypi.org --надежного хозяина имя_пакета files.pythonhosted.org
Comments