urllib и "SSL: CERTIFICATE_VERIFY_FAILED" Ошибка

Я получаю эту ошибку

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 Im требует, чтобы я использовал https. Как я могу сделать это в обход проверки?

  • Ошибка Python 3.0 urllib.parse «Тип str не поддерживает API-интерфейс буфера»
  • IOError: getaddrinfo не удалось
  • Попытка опубликовать данные о многочастной форме в python, не будет публиковать
  • Как загрузить файл через HTTP с помощью Python?
  • Python: Загрузить возвращенный Zip-файл из URL-адреса
  • Как я могу создать экземпляр GzipFile из «файла-подобного объекта», который возвращает urllib.urlopen ()?
  • Как я могу войти в facebook с помощью python (request / urllib3)?
  • Ошибка Python при использовании urllib.open
  • 17 Solutions collect form web for “urllib и "SSL: CERTIFICATE_VERIFY_FAILED" Ошибка”

    Если вы просто хотите обойти проверку, вы можете создать новый 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] потому что вы сейчас не проверяете сертификат!

    Чтобы добавить к вышесказанному, если вы хотите узнать больше о том, почему вы видите эти проблемы, вам нужно взглянуть на 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 соединения. Это изменение для certifi 3.6 на OSX, и требуется шаг после установки, который устанавливает сертификат сертификатов certifi . Это /Applications/Python\ 3.6/ReadMe.rtf в ReadMe, которое вы должны найти в /Applications/Python\ 3.6/ReadMe.rtf

    ReadMe запустит этот сценарий после установки, который просто устанавливает certifi : /Applications/Python\ 3.6/Install\ Certificates.command

    В примечаниях к выпуску есть дополнительная информация: https://www.python.org/downloads/release/python-360/

    В Windows Python не смотрит на системный сертификат, он использует свой собственный ?\lib\site-packages\certifi\cacert.pem расположенный в ?\lib\site-packages\certifi\cacert.pem .

    Решение вашей проблемы:

    1. загрузить сертификат проверки домена как файл * .crt или * pem
    2. открыть файл в редакторе и скопировать его содержимое в буфер обмена
    3. найдите свое местоположение cacert.pem : from requests.utils import DEFAULT_CA_BUNDLE_PATH; print(DEFAULT_CA_BUNDLE_PATH) cacert.pem from requests.utils import DEFAULT_CA_BUNDLE_PATH; print(DEFAULT_CA_BUNDLE_PATH) from requests.utils import DEFAULT_CA_BUNDLE_PATH; print(DEFAULT_CA_BUNDLE_PATH)
    4. отредактируйте файл cacert.pem и вставьте сертификат проверки домена в конец файла.
    5. Сохраните файл и получите удовольствие!

    Вы можете попробовать добавить это к переменным среды:

     PYTHONHTTPSVERIFY=0 

    Как я уже писал в комментарии, эта проблема, вероятно, связана с этим SO-ответом .

    Короче: существует несколько способов проверки сертификата. Проверка, используемая OpenSSL, несовместима с доверенными корневыми сертификатами, которые у вас есть в вашей системе. OpenSSL используется Python.

    Вы можете попробовать получить отсутствующий сертификат для Verisign Class 3 Public Primary Certification Authority, а затем использовать опцию cafile соответствии с документацией Python :

     urllib2.urlopen(req, cafile="verisign.pem") 

    Для Python 3.4+ на Centos 6/7 , Fedora , просто установите доверенный CA так:

    1. Скопируйте CA.crt в /etc/pki/ca-trust/source/anchors/
    2. update-ca-trust force-enable
    3. update-ca-trust extract

    Чтобы расширить ответ Крейга Гленни (извините, недостаточно репутации для комментариев):

    в Python 3.6.1 на MacOs Sierra

    Ввод этого в терминале bash решил проблему:

     pip install certifi /Applications/Python\ 3.6/Install\ Certificates.command 

    Как и вы, я использую python 2.7 на своем старом iMac (OS X 10.6.8), я тоже столкнулся с проблемой, используя urllib2.urlopen:

     urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] 

    Мои программы работали нормально без проблем с сертификатами SSL и с удовольствием (после загрузки программ), они рухнули с этой ошибкой SSL.

    Проблема заключалась в использовании версии python:

    1. Нет проблем с https://www.python.org/downloads и python-2.7.9-macosx10.6.pkg

    2. проблема с установкой инструмента Homebrew : «brew install python», версия, расположенная в каталоге / usr / local / bin.

    Глава, называемая Certificate verification and OpenSSL [CHANGED for Python 2.7.9] , в /Applications/Python 2.7/ReadMe.rtf объясняет проблему со многими подробностями.

    Итак, проверьте, загрузите и установите в свою PATH правильную версию python.

     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

    Пытаться

    pip install –trusted-host pypi.python.org packagename

    Это сработало для меня.

    Мне нужно добавить еще один ответ, потому что, как и Крейг Гленни, я отправился в дикую погоню за гусями из-за многих сообщений, относящихся к этой проблеме в Интернете.

    Я использую MacPorts, и то, что я изначально считал проблемой Python, было проблемой MacPorts: она не устанавливает корневой сертификат с его установкой openssl. Решение – port install curl-ca-bundle , как указано в этом сообщении в блоге .

    Я повесил голову в полупомех, поскольку у меня была такая же проблема, за исключением того, что в моем случае URL-адрес, который я ударил, был действительным, сертификат действителен. То, что было недействительным, было моим подключением к сети. Мне не удалось добавить данные прокси в браузер (в этом случае IE). Это остановило процесс проверки правильно.
    Добавлено в подробности прокси, и мой python был тогда очень счастлив.

    Если вы на vCenter 6, вы должны добавить сертификат vmware сертификата vCenter vCenter в список доверенных ЦС вашей ОС. Чтобы загрузить свой сертификат, выполните следующие действия.

    1. Откройте веб-браузер.
    2. Перейдите к https: //
    3. В нижнем правом углу нажмите ссылку «Загрузить доверенный корневой CA»

    В Fedora

    1. разархивируйте и измените расширение с .0 на .cer
    2. Скопируйте его в / etc / pki / ca-trust / source / anchors /
    3. запустите команду update-ca-trust.

    Ссылки:

    1. https://virtualizationreview.com/articles/2015/04/02/install-root-self-signed-certificate-vcenter-6.aspx?m=1
    2. http://forums.fedoraforum.org/showthread.php?t=293856

    Python 2.7.12 (по умолчанию, 29 июля 2016, 15:26:22) исправил указанную проблему. Эта информация может помочь кому-то другому.

    Взгляни на

    / Приложения / Python 3.6 / Установить Certificates.command

    Вы также можете перейти к разделу «Приложения и нажмите« Certificates.command »

    установка шагов для nltk (у меня был установлен python3 (3.6.2) уже в MAC OS X

     sudo easy_install pip 

    использовать игнорировать установленную опцию, чтобы игнорировать удаление предыдущей версии из шести, иначе она выдает ошибку при удалении и не переходит вперед

     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 для примеров книг

    ln -s /usr/local/share/certs/ca-root-nss.crt /etc/ssl/cert.pem

    ( FreeBSD 10.1 )

    Python - лучший язык программирования в мире.