Я получаю следующую ошибку:
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. Как я могу сделать это в обход проверки?
python
python-2.7
ssl
ssl-certificate
urllib
user3724476
источник
источник
Ответы:
Если вы просто хотите обойти проверку, вы можете создать новый SSLContext . По умолчанию вновь созданные контексты используют CERT_NONE .
Будьте осторожны с этим, как указано в разделе 17.3.7.2.1
Но если вы просто хотите, чтобы это работало сейчас, по какой-то другой причине, вы можете сделать следующее, вам также нужно будет
import ssl
:Это должно обойти вашу проблему, но вы на самом деле не решаете ни одну из проблем, но вы не увидите ее,
[SSL: CERTIFICATE_VERIFY_FAILED]
потому что вы сейчас не проверяете сертификат!Чтобы добавить к вышесказанному, если вы хотите узнать больше о том, почему вы видите эти проблемы, вы должны взглянуть на PEP 476 .
Есть рекомендуемый отказ, который не отличается от моего совета выше:
Он также имеет крайне обескураженную опцию с помощью monkeypatching, которую вы не часто видите в python:
Который переопределяет функцию по умолчанию для создания контекста с помощью функции для создания непроверенного контекста.
Обратите внимание на это, как указано в PEP:
Если вы хотите прочитать статью о том, почему не проверка сертификатов плоха в программном обеспечении, вы можете найти ее здесь !
источник
setup.py upload
как я могу это исправить?certifi
и обновление openssl на коробках.context
это то, что мне нужноЭто не решение вашей конкретной проблемы, но я помещаю это здесь, потому что эта тема является лучшим результатом Google для "SSL: CERTIFICATE_VERIFY_FAILED", и это приводит меня к безумной погоне за погоней.
Если вы установили Python 3.6 в OSX и получаете сообщение об ошибке «SSL: CERTIFICATE_VERIFY_FAILED» при попытке подключения к сайту https: //, возможно, это связано с тем, что Python 3.6 в OSX вообще не имеет сертификатов и не может проверить любой SSL соединения. Это изменение для 3.6 в OSX и требует шага после установки, который устанавливает
certifi
пакет сертификатов. Это задокументировано в ReadMe, которое вы должны найти на/Applications/Python\ 3.6/ReadMe.rtf
ReadMe предложит вам запустить скрипт после установки, который просто устанавливает
certifi
:/Applications/Python\ 3.6/Install\ Certificates.command
Примечания к выпуску содержат дополнительную информацию: https://www.python.org/downloads/release/python-360/.
источник
/Applications/Python\ 3.7/Install\ Certificates.command
управляющего этим непосредственно вterminal
! Спасибо @CraigGlennie & @muyong, я благодаренout-of-the-box-thinking
за размещение здесь!Чтобы расширить ответ Крейга Гленни:
в Python 3.6.1 на MacOs Sierra
Ввод этого в терминале bash решил проблему:
источник
sudo /Applications/Python\ 3.6/Install\ Certificates.command
если разрешения запрещены.В Windows Python не смотрит на системный сертификат, он использует свой собственный каталог
?\lib\site-packages\certifi\cacert.pem
.Решение вашей проблемы:
cacert.pem
местоположение:from requests.utils import DEFAULT_CA_BUNDLE_PATH; print(DEFAULT_CA_BUNDLE_PATH)
cacert.pem
файл и вставьте сертификат проверки домена в конец файла.источник
lib\site-packages\certifi\cacert.pem
не существует в Python 2.7.10. И речь идет оurllib2
неrequests
/usr/local/lib/python2.7/dist-packages/certifi-2015.09.06.2-py2.7.egg/certifi/cacert.pem
. Спасибо!Мое решение для Mac OS X:
1) Обновление до Python 3.6.5 с использованием собственного установщика Python, загруженного с официального веб-сайта языка Python https://www.python.org/downloads/
Я обнаружил, что этот установщик заботится об обновлении ссылок и символических ссылок для нового Python намного лучше, чем homebrew.
2) Установите новый сертификат, используя «./Install Certificates.command», который находится в обновленном каталоге Python 3.6.
источник
Вы можете попробовать добавить это к переменным вашей среды:
Обратите внимание, что это отключит все проверки HTTP, так что это немного похоже на кувалду, однако, если проверка не требуется, это может быть эффективным решением.
источник
У меня была похожая проблема, хотя я использовал
urllib.request.urlopen
в Python 3.4, 3.5 и 3.6 . (Это часть эквивалента Python 3urllib2
, согласно примечанию в началеurllib2
страницы документации Python 2. )Моим решением было
pip install certifi
установитьcertifi
, который имеет:Затем в моем коде, где я ранее только что был:
Я изменил это, чтобы:
Если я правильно прочитал
urllib2.urlopen
документацию , у него тоже естьcafile
аргумент. Таким образом,urllib2.urlopen([...], certifi.where())
может работать и для Python 2.7.UPDATE (2020-01-01): По состоянию на Python 3.6, аргумент является устаревшим , с аргументом должен быть указан вместо этого. Я нашел следующее, чтобы работать одинаково хорошо на 3,5 до 3,8:
cafile
urlopen
context
источник
load_verify_locations
мутируетSSLContext
экземпляр и возвращаетNone
. Вы должны использоватьcontext=ssl.create_default_context(cafile=certifi.where())
вместо этого. Смотритеssl
документы для получения дополнительной информации.ssl
функцию. См редактировать; ОК?Взято отсюда https://gist.github.com/michaelrice/a6794a017e349fc65d01
источник
Как я уже писал в комментарии, эта проблема, вероятно, связана с этим SO ответом .
Вкратце: существует несколько способов проверки сертификата. Проверка, используемая OpenSSL, несовместима с доверенными корневыми сертификатами, имеющимися в вашей системе. OpenSSL используется Python.
Вы можете попытаться получить отсутствующий сертификат для публичного первичного центра сертификации Verisign Class 3, а затем использовать
cafile
опцию в соответствии с документацией Python :источник
У меня была похожая проблема на одной из моих машин Linux. Создание свежих сертификатов и экспорт переменной среды, указывающей на каталог сертификатов, исправили это для меня:
источник
Мне нужно добавить еще один ответ, потому что, как и Крейг Гленни, я продолжал погоню за гусиной кожей из-за множества постов, посвященных этой проблеме в Интернете.
Я использую MacPorts, и то, что я изначально думал, что это проблема Python, на самом деле было проблемой MacPorts: он не устанавливает корневой сертификат при установке openssl. Решение состоит в том
port install curl-ca-bundle
, как упомянуто в этом сообщении в блоге .источник
Я нашел это здесь
Я нашел это решение, вставьте этот код в начало вашего исходного файла:
Этот код отменяет проверку, поэтому сертификация ssl не проверяется.
источник
Для Python 3.4+ в Centos 6/7 , Fedora , просто установите доверенный CA следующим образом:
/etc/pki/ca-trust/source/anchors/
update-ca-trust force-enable
update-ca-trust extract
источник
Решение для Анаконды
Моя установка - Anaconda Python 3.7 на MacOS с прокси. Пути разные.
который в моей системе производится
Как только вы узнаете, куда отправляется сертификат, вы соединяете сертификат, используемый прокси, в конец этого файла.
Я уже настроил conda для работы с моим прокси, запустив:
Если вы не помните, где находится ваш сертификат, вы можете найти его в
~/.condarc
:Теперь конкатенируйте этот файл до конца
/miniconda3/ssl/cert.pem
и запросы должны работать, а в частностиsklearn.datasets
и аналогичные инструменты должны работать.Дальнейшие предостережения
Другие решения не работали, потому что установка Anaconda немного отличается:
Путь
Applications/Python\ 3.X
просто не существует.Путь, предоставленный командами ниже, является НЕПРАВИЛЬНЫМ путем
источник
Я опускаю голову в полус стыде, поскольку у меня была та же проблема, за исключением того, что в моем случае URL, который я нажимал, был действительным, сертификат был действительным. Недействительным было мое подключение к сети. Мне не удалось добавить детали прокси в браузер (в данном случае IE). Это остановило процесс проверки правильности.
Добавил в прокси подробности и мой питон был тогда очень доволен.
источник
В Python 2.7.12 (по умолчанию, 29 июля 2016, 15:26:22) исправлена упомянутая проблема. Эта информация может помочь кому-то еще.
источник
certifi
, кажущийся скрежет сертификатов , проводимыхrequests
, исправили проблему для меня на Python 3.4 до 3.6 .Я удивлен, что все эти инструкции не решили мою проблему. Тем не менее, диагностика правильная (кстати, я использую Mac и Python3.6.1). Итак, подведем итог правильной части:
Для меня скрипт не работает, и все эти установки certifi и openssl тоже не удалось исправить. Может быть, потому что у меня есть несколько установок Python 2 и 3, а также много virtualenv. В конце мне нужно починить вручную.
Если это все еще не удается. Затем переустановите OpenSSL.
источник
Как и вы, я использую python 2.7 на моем старом iMac (OS X 10.6.8), я тоже столкнулся с проблемой, используя urllib2.urlopen:
Мои программы работали нормально, без проблем с сертификатами SSL, и неожиданно (после загрузки программ) они вылетали с этой ошибкой SSL.
Проблема заключалась в используемой версии python:
Нет проблем с https://www.python.org/downloads и python-2.7.9-macosx10.6.pkg
проблема с установкой 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.
источник
Python 2.7 на Amazon EC2 с CentOS 7
Я должен был установить переменную env,
SSL_CERT_DIR
чтобы указать на мой,ca-bundle
который был расположен в/etc/ssl/certs/ca-bundle.crt
источник
SSL_CERT_DIR
на/etc/ssl/certs
, а также убедитесь , чтоca-certificates
был установлен и до настоящего времени пакет.Источник: https://access.redhat.com/articles/2039753
источник
Пытаться
Это сработало для меня.
источник
Взгляни на
/ Приложения / Python 3.6 / Установить Certificates.command
Вы также можете перейти к разделу «Приложения» и нажать «Сертификаты»
источник
В моем случае я получал эту ошибку, потому что
requests
иurllib3
версии были несовместимы, выдавая следующую ошибку во время установки:сделал свое дело.
источник
Еще одно решение Анаконды.Я получал CERTIFICATE_VERIFY_FAILED в моей среде Python 2.7 на macOS. Оказывается, конда пути были плохими:
базовая (3.7) среда:
2.7 окружение (пути не существовали!):
Исправление:
источник
Ошибка SSL: CERTIFICATE_VERIFY_FAILED также может возникать из-за отсутствия промежуточного сертификата в
ca-certificates
пакете в Linux. Например, в моем случае промежуточный сертификат « DigiCert SHA2 Secure Server CA » отсутствовал вca-certificates
пакете, даже если браузер Firefox его содержит. Вы можете узнать, какой сертификат отсутствует, непосредственно выполнивwget
команду на URL-адресе, вызвавшем эту ошибку. Затем вы можете найти соответствующую ссылку на файл CRT для этого сертификата на официальном сайте (например, https://www.digicert.com/digicert-root-certificates.htm в моем случае) центра сертификации. Теперь, чтобы включить сертификат, который отсутствует в вашем случае, вы можете выполнить следующие команды, используя вместо этого ссылку на скачивание файла CRT:После этого вы можете снова протестировать
wget
ваш URL, а также использоватьurllib
пакет python . Для получения более подробной информации, обратитесь к: https://bugs.launchpad.net/ubuntu/+source/ca-certificates/+bug/1795242источник
Если вы используете vCenter 6, вам следует вместо этого добавить сертификат центра сертификации vmware вашего vCenter в список доверенных ЦС вашей ОС. Для загрузки вашего сертификата сделайте следующее
На федоре
Ссылки:
источник
установка шагов для nltk (у меня уже был установлен python3 (3.6.2) в MAC OS X
используйте игнорировать установленную опцию, чтобы игнорировать удаление предыдущей версии шести, иначе, это выдает ошибку при удалении и не перематывает фильм вперед
Проверьте установку pip и python, используйте «3» версии
Проверьте, установлен ли NLTK
Установите SSL-сертификат перед установкой книги с примерами, иначе мы установим ошибку при установке примеров.
Это успешно завершило установку nltk и nltk_ata для примеров книг
источник
Установка
PyOpenSSL
с использованиемpip
работала для меня (без конвертации в PEM):источник
Я решил эту проблему, закрыв проверку Fiddler (прокси-сервер отладки HTTP), если у вас включен прокси-сервер, и повторите попытку.
источник
В Python 2.7 добавлено добавление сведений о доверенном корневом СА в конце файла C: \ Python27 \ lib \ site-packages \ certifi \ cacert.pem.
после этого я запустил (используя права администратора) pip install --trusted-host pypi.python.org --trusted-host pypi.org --trusted-host files.pythonhosted.org packageName
источник