urllib и ошибка «SSL: CERTIFICATE_VERIFY_FAILED»

279

Я получаю следующую ошибку:

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

user3724476
источник
2
В этом URL нет ничего плохого, и его можно успешно проверить с помощью общих доверенных сертификатов. Так что лучше не пытаться обходить проверку сертификата, а исправить это. Какую версию Python вы используете?
Штеффен Ульрих
Это может быть связано с stackoverflow.com/a/27826829/3081018 . Сервер использует один и тот же тип цепочки сертификатов с несколькими путями доверия. Посмотрите, какое кафе вам может понадобиться для проверки.
Штеффен Ульрих
7
Эта ошибка также возникает в Python 3.5 после обновления до
yosemite
2
Это объясняет ситуацию. access.redhat.com/articles/2039753
Чарли Бернс
4
"Как я могу обойти проверку?" это неправильный вопрос. Возможно, вам следует спросить, как проверить сертификат, предоставленный доменом.
17

Ответы:

297

Если вы просто хотите обойти проверку, вы можете создать новый 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()  # Only for gangstars
info = urllib2.urlopen(req, context=gcontext).read()
Message.Chat.SendMessage ("" + info)

Это должно обойти вашу проблему, но вы на самом деле не решаете ни одну из проблем, но вы не увидите ее, [SSL: CERTIFICATE_VERIFY_FAILED]потому что вы сейчас не проверяете сертификат!

Чтобы добавить к вышесказанному, если вы хотите узнать больше о том, почему вы видите эти проблемы, вы должны взглянуть на PEP 476 .

В этом PEP предлагается включить проверку подписей сертификатов X509, а также проверку имени хоста для клиентов Python HTTP по умолчанию при условии отказа для каждого вызова. Это изменение будет применено к 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

Который переопределяет функцию по умолчанию для создания контекста с помощью функции для создания непроверенного контекста.

Обратите внимание на это, как указано в PEP:

Это руководство предназначено, прежде всего, для системных администраторов, которые хотят внедрить более новые версии Python, которые реализуют этот PEP в устаревших средах, которые еще не поддерживают проверку сертификатов для соединений HTTPS. Например, администратор может отказаться, добавив указанный выше обезьян-патч к sitecustomize.py в своей стандартной операционной среде для Python. Приложениям и библиотекам НЕ СЛЕДУЕТ делать этот процесс широким (за исключением, возможно, в ответ на настройки конфигурации, контролируемые системным администратором).

Если вы хотите прочитать статью о том, почему не проверка сертификатов плоха в программном обеспечении, вы можете найти ее здесь !

Noelkd
источник
1
Так что, если эта ошибка удерживает меня от использования, setup.py uploadкак я могу это исправить?
PyCthon
5
ssl._create_default_https_context = ssl._create_unverified_context это сработало для меня, как упомянул Noelkd ближе к концу. Так как у нас есть интранет-сайт для принтеров HP ... используется исключительно для очистки ... у нас нет проблем с использованием этого метода.
Высшая башня
Ваш первый метод наименее желателен - обходной валидации. Почему тот, который действительно проверяет сертификат, не указан первым?
17
1
это также может произойти, если у вас устаревшая версия openSSL. Поэтому для меня работало обновление до самой последней версии certifi и обновление openssl на коробках.
myusuf3
1
context это то, что мне нужно
praagagupd
382

Это не решение вашей конкретной проблемы, но я помещаю это здесь, потому что эта тема является лучшим результатом 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/.

Крейг Гленни
источник
105
Непосредственно запустите / Applications / Python \ 3.6 / Install \ Certificates.com и решите мою проблему в OSX. Спасибо.
Muyong
2
Я использую OS X El Capitan 10.11.6, Python 3.6.0, и это решение отлично работает.
y2knoproblem
2
Я использую macOS Sierra 10.12.5, Python 3.6.1, и это решение отлично работает.
Джеймс
4
Это исправило это для меня, /Applications/Python\ 3.7/Install\ Certificates.command управляющего этим непосредственно в terminal! Спасибо @CraigGlennie & @muyong, я благодарен out-of-the-box-thinkingза размещение здесь!
ДжейРиззо
6
Python 3.7 на MacOS Mojave: здесь он не работает. Я удалил / переустановил / запустил установочный сертификат, перезагрузил и т. Д. У меня не работает
Thomas
71

Чтобы расширить ответ Крейга Гленни:

в Python 3.6.1 на MacOs Sierra

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

pip install certifi
/Applications/Python\ 3.6/Install\ Certificates.command
jnPy
источник
3
попробуйте, sudo /Applications/Python\ 3.6/Install\ Certificates.commandесли разрешения запрещены.
KingKongCoder
На самом деле это не решает проблему на Python 3.6. -1
гиперум
1
Если использование командной строки выводит вас из себя (вероятно, не из-за того, что вы здесь, а из-за эй), вы также можете найти папку «Программы» (или эквивалентную в других ОС), которую Python создал при установке, а затем открыть сценарий, дважды щелкнув. Конкретное имя папки зависит от установленной версии Python.
Эрдос-Бэкон
Работал как брелок для Python 3.7.3. Спасибо.
klbytec
Спасибо. Я буквально искал сотни решений, и твое сработало.
NND
43

В Windows Python не смотрит на системный сертификат, он использует свой собственный каталог ?\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)
  4. отредактируйте cacert.pemфайл и вставьте сертификат проверки домена в конец файла.
  5. Сохраните файл и наслаждайтесь запросами!
Бруно Габузомеу
источник
6
lib\site-packages\certifi\cacert.pemне существует в Python 2.7.10. И речь идет о urllib2неrequests
Кевин Смит
2
Лучшее решение на данный момент, твиттер API использует сертификат DigiCert, которого нет в файле cacert.pem моего python. Я добавил туда и VOILA!
digz6666
2
Работал на Debian. Для записей, путь к файлу на моей системе было: /usr/local/lib/python2.7/dist-packages/certifi-2015.09.06.2-py2.7.egg/certifi/cacert.pem. Спасибо!
ofavre
К сожалению, запросы Python не используют хранилище доверия CA какой-либо операционной системы. github.com/requests/requests/issues/2966 . Вы должны установить REQUESTS_CA_BUNDLE github.com/bloomreach/s4cmd/issues/111#issuecomment-406839514 .
Джамшид
Работает на Windows 10, Python 3.6, с API Google и Twitter и модулем запросов в целом.
Бриттенб
36

Мое решение для Mac OS X:

1) Обновление до Python 3.6.5 с использованием собственного установщика Python, загруженного с официального веб-сайта языка Python https://www.python.org/downloads/

Я обнаружил, что этот установщик заботится об обновлении ссылок и символических ссылок для нового Python намного лучше, чем homebrew.

2) Установите новый сертификат, используя «./Install Certificates.command», который находится в обновленном каталоге Python 3.6.

> cd "/Applications/Python 3.6/"
> sudo "./Install Certificates.command"
Клод Куломб
источник
Работал как шарм в Mac OS X.
Ману Мэтью
31

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

PYTHONHTTPSVERIFY=0 

Обратите внимание, что это отключит все проверки HTTP, так что это немного похоже на кувалду, однако, если проверка не требуется, это может быть эффективным решением.

Крис Хэлкроу
источник
17
Я подозреваю, что отключение всей HTTP-проверки для всего Python является излишним, чтобы справиться с одной ошибкой при проверке. Существует много случаев, когда по умолчанию может потребоваться проверка.
trevorKirkby
У меня работал на Windows Server 2016 на python 2.7.13. Обычно у меня нет установленного Python на серверах Windows, но он мне нужен для обновления vCenter с миграцией Nexus 1000v на VDS, и это только устраняет проблему с самоподписанным сертификатом vCenter в настоящее время (я буду использовать VMCA и действительные сертификаты в модернизированная среда). Мне не повезло получить сертификат, который будет принят, отредактировав cacert.pem в пакете запроса python
Кристофер Торюссен,
3
Кроме того, я устанавливаю переменную непосредственно в окне командной строки перед запуском скрипта, чтобы она не отключала все проверки, которые, как боятся люди, кого-то или другого, я бы тоже не рекомендовал.
Кристофер Торюссен
Это идеально подходит для моего варианта использования: тестирование. Я бы никогда не сделал это на производстве, но для запуска тестов, которые не имеют ничего общего с SSL, это замечательный вариант.
сорин
Спасибо, это решение сделало это для меня: import os os.environ ["PYTHONHTTPSVERIFY"] = "0"
mbello
29

У меня была похожая проблема, хотя я использовал urllib.request.urlopenв Python 3.4, 3.5 и 3.6 . (Это часть эквивалента Python 3 urllib2, согласно примечанию в начале urllib2страницы документации Python 2. )

Моим решением было pip install certifiустановить certifi, который имеет:

... тщательно отобранная коллекция корневых сертификатов для проверки надежности сертификатов SSL при проверке подлинности хостов TLS.

Затем в моем коде, где я ранее только что был:

import urllib.request as urlrq

resp = urlrq.urlopen('https://example.com/bar/baz.html')

Я изменил это, чтобы:

import urllib.request as urlrq
import certifi

resp = urlrq.urlopen('https://example.com/bar/baz.html', cafile=certifi.where())

Если я правильно прочитал urllib2.urlopenдокументацию , у него тоже есть cafileаргумент. Таким образом, urllib2.urlopen([...], certifi.where())может работать и для Python 2.7.


UPDATE (2020-01-01): По состоянию на Python 3.6, аргумент является устаревшим , с аргументом должен быть указан вместо этого. Я нашел следующее, чтобы работать одинаково хорошо на 3,5 до 3,8:cafileurlopencontext

import urllib.request as urlrq
import certifi
import ssl

resp = urlrq.urlopen('https://example.com/bar/baz.html', context=ssl.create_default_context(cafile=certifi.where()))
hBy2Py
источник
1
load_verify_locationsмутирует SSLContextэкземпляр и возвращает None. Вы должны использовать context=ssl.create_default_context(cafile=certifi.where())вместо этого. Смотрите sslдокументы для получения дополнительной информации.
Острокач
1
@ostrokach Да, я пробовал что-то подобное, но, должно быть, я использовал не ту sslфункцию. См редактировать; ОК?
hBy2Py
13
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

Простак
источник
протестировал это решение в среде Jenkins, личной среде, это работает!
rapport89
2
Это крайне небезопасно, поскольку оно обходит ВСЕ проверки сертификатов, пользуйтесь на свой страх и риск, и ради Любого не используйте это в рабочем коде.
dragon788
Спасибо. Наконец-то это сработало. Не обязательно, чтобы Python 3.6 был установлен в / Applications в Mac OS. Это должен быть принятый ответ.
Биранчи
Вы никогда не должны делать такие обезьяньи патчи. Это чрезвычайно опасно и повлияет на все последующее использование кода.
Acumenus
10

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

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

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

urllib2.urlopen(req, cafile="verisign.pem")
Штеффен Ульрих
источник
Можете ли вы помочь мне, плз решить эту проблему в Python и ссылку
Нет
8

У меня была похожая проблема на одной из моих машин Linux. Создание свежих сертификатов и экспорт переменной среды, указывающей на каталог сертификатов, исправили это для меня:

$ sudo update-ca-certificates --fresh
$ export SSL_CERT_DIR=/etc/ssl/certs
ritiek
источник
7

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

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

corwin.amber
источник
5

Я нашел это здесь

Я нашел это решение, вставьте этот код в начало вашего исходного файла:

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

Этот код отменяет проверку, поэтому сертификация ssl не проверяется.

Ганеш Чоудхари Саданала
источник
Посмотрите это видео, это помогло мне понять, что такое SSL. URL видео: youtu.be/dsuVPxuU_hc
Ганеш Чоудхари Саданала
4

Для 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
Cherif KAOUA
источник
2
Может быть глупый вопрос, но что такое CA.crt и где его найти?
Икбал
4

Решение для Анаконды

Моя установка - Anaconda Python 3.7 на MacOS с прокси. Пути разные.

  • Вот как вы получаете правильный путь сертификатов:
import ssl
ssl.get_default_verify_paths()

который в моей системе производится

Out[35]: DefaultVerifyPaths(cafile='/miniconda3/ssl/cert.pem', capath=None,
 openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/miniconda3/ssl/cert.pem',
 openssl_capath_env='SSL_CERT_DIR', openssl_capath='/miniconda3/ssl/certs')

Как только вы узнаете, куда отправляется сертификат, вы соединяете сертификат, используемый прокси, в конец этого файла.

Я уже настроил conda для работы с моим прокси, запустив:

conda config --set ssl_verify <pathToYourFile>.crt

Если вы не помните, где находится ваш сертификат, вы можете найти его в ~/.condarc:

ssl_verify: <pathToYourFile>.crt

Теперь конкатенируйте этот файл до конца /miniconda3/ssl/cert.pem и запросы должны работать, а в частности sklearn.datasetsи аналогичные инструменты должны работать.

Дальнейшие предостережения

Другие решения не работали, потому что установка Anaconda немного отличается:

  • Путь Applications/Python\ 3.Xпросто не существует.

  • Путь, предоставленный командами ниже, является НЕПРАВИЛЬНЫМ путем

from requests.utils import DEFAULT_CA_BUNDLE_PATH
DEFAULT_CA_BUNDLE_PATH
Лео
источник
3

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

Объявления
источник
1
Не опускайте голову от стыда за то, что вы что-то забыли, а потом поняли и поделились, кто-то может найти это полезным. Используя IE, хотя ... позор: p
Давос
3

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

caot
источник
3
Я столкнулся с этим на 2.7.12 на Mac, используя библиотеку urllib2, хотя с библиотекой рекветов все в порядке
marcadian
@marcadian Установка и использование certifi, кажущийся скрежет сертификатов , проводимых requests, исправили проблему для меня на Python 3.4 до 3.6 .
hBy2Py
3

Я удивлен, что все эти инструкции не решили мою проблему. Тем не менее, диагностика правильная (кстати, я использую Mac и Python3.6.1). Итак, подведем итог правильной части:

  • На Mac Apple выпускает OpenSSL
  • Python теперь использует собственный набор корневых сертификатов CA
  • Двоичная установка Python предоставила скрипт для установки корневого сертификата CA, необходимого Python ("/ Applications / Python 3.6 / Install Certificates.command")
  • Прочитайте "/ Applications / Python 3.6 / ReadMe.rtf" для подробностей

Для меня скрипт не работает, и все эти установки 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
berniey
источник
2

Как и вы, я использую 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.

Тьерри Майяр
источник
2

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был установлен и до настоящего времени пакет.
Норман
1

Пытаться

pip install --trusted-host pypi.python.org имя_пакета

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

swapnilghorpade
источник
1

Взгляни на

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

Вы также можете перейти к разделу «Приложения» и нажать «Сертификаты»

Даниэль Коэн
источник
1

В моем случае я получал эту ошибку, потому что requestsи urllib3версии были несовместимы, выдавая следующую ошибку во время установки:

ERROR: requests 2.21.0 has requirement urllib3<1.25,>=1.21.1, but you'll have urllib3 1.25 which is incompatible.
pip install 'urllib3<1.25' --force-reinstall

сделал свое дело.

fabio.sang
источник
1

Еще одно решение Анаконды.Я получал CERTIFICATE_VERIFY_FAILED в моей среде Python 2.7 на macOS. Оказывается, конда пути были плохими:

базовая (3.7) среда:

>>> import ssl
>>> ssl.get_default_verify_paths()
DefaultVerifyPaths(cafile='/usr/local/anaconda3/ssl/cert.pem', capath=None, openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/usr/local/anaconda3/ssl/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='/usr/local/anaconda3/ssl/certs')

2.7 окружение (пути не существовали!):

DefaultVerifyPaths(cafile='', capath=None, openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/usr/local/anaconda3/envs/py27/ssl/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='/usr/local/anaconda3/envs/py27/ssl/certs')

Исправление:

cd /usr/local/anaconda3/envs/py27/
mkdir ssl
cd ssl
ln -s ../../../ssl/cert.pem
Питер Ценг
источник
1

Ошибка 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 https://cacerts.digicert.com/DigiCertSHA2SecureServerCA.crt

mv DigiCertSHA2SecureServerCA.crt DigiCertSHA2SecureServerCA.der

openssl x509 -inform DER -outform PEM -in DigiCertSHA2SecureServerCA.der -out DigicertSHA2SecureServerCA.pem.crt

sudo mkdir /usr/share/ca-certificates/extra

sudo cp DigicertSHA2SecureServerCA.pem.crt /usr/share/ca-certificates/extra/

sudo dpkg-reconfigure ca-certificates

После этого вы можете снова протестировать wgetваш URL, а также использовать urllibпакет python . Для получения более подробной информации, обратитесь к: https://bugs.launchpad.net/ubuntu/+source/ca-certificates/+bug/1795242

WebDev
источник
0

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

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

На федоре

  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
nobler1050
источник
Он заявил, что работает на OS X, а не на vCenter 6.
августа
0

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

Нарасимха Саи
источник
0

Установка PyOpenSSLс использованием pipработала для меня (без конвертации в PEM):

pip install PyOpenSSL
averma93
источник
0

Я решил эту проблему, закрыв проверку Fiddler (прокси-сервер отладки HTTP), если у вас включен прокси-сервер, и повторите попытку.

vperezb
источник
0

В 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

MD5
источник