Что видно в консоли
При установке пакета pip печатает цепочку повторных попыток и заканчивает сообщением вроде «Could not fetch URL … SSL: CERTIFICATE_VERIFY_FAILED … certificate verify failed: unable to get local issuer certificate» либо «self signed certificate in certificate chain». Это значит: Python не доверяет сертификату сервера с пакетами и обрывает соединение до скачивания.
В такой ситуации браузер на том же компьютере может открывать нужный сайт без единого предупреждения. Дело в том, что Python и pip проверяют сертификат по собственному набору корневых сертификатов, а не по хранилищу операционной системы.
Что чаще всего к этому приводит
На первом месте сеть с перехватом шифрованного трафика: корпоративный шлюз или антивирус подписывают соединение своим сертификатом, а Python о нём не знает. На втором месте устаревшая установка Python с давно не обновлявшимся набором корней, что типично для старых версий и для окружений, которые не обновлялись годами.
Далее: сдвинутые системные часы, сломанное виртуальное окружение с неверно указанным путём к сертификатам, а также переменные окружения, оставшиеся от других настроек и указывающие на несуществующий файл. На компьютерах с macOS известна ситуация, когда после установки Python с сайта нужно отдельно запустить установку сертификатов, которая идёт в комплекте.
Порядок проверки: pip и CERTIFICATE_VERIFY_FAILED
Сначала посмотрите дату и время, затем проверьте, работает ли обращение к тому же серверу пакетов из другой сети. Если на мобильной передаче данных всё устанавливается, проблема в вашей домашней или рабочей сети либо в защитной программе.
Проверьте, не заданы ли переменные окружения, задающие файл сертификатов, и файл настроек pip с параметром доверенного хоста или пути к сертификатам. Запустите pip с подробным выводом: в нём видно, к какому адресу идёт запрос и на каком шаге всё ломается.
Попробуйте обновить сам pip и набор пакета сертификатов внутри окружения. Если обновить нельзя из-за той же ошибки, скачайте свежую версию другим способом или обновите Python целиком.
Если ошибка проявилась внезапно на давно работавшей установке, вспомните, что менялось: обновление антивируса, подключение к корпоративной сети, перенос проекта на другой компьютер. Часто достаточно вернуть прежние условия, чтобы понять, какой именно фактор внёс собственный сертификат в цепочку.
Решения: pip и CERTIFICATE_VERIFY_FAILED
Если сеть с перехватом трафика, получите у администратора файл с корневым сертификатом организации и укажите его pip через параметр или в настройках. Это сохраняет проверку и убирает ошибку.
Если устарел Python, обновите его или пакет сертификатов. На macOS выполните скрипт установки сертификатов, идущий вместе с установщиком Python.
Параметр trusted-host заставляет pip не проверять сертификат для указанного сервера. Он рабочий, но ослабляет защиту, поэтому подходит для временной ситуации и лучше в паре с поиском настоящей причины. Не оставляйте его в общих настройках надолго.
Когда виноват сервер пакетов
Крайне редко проблема на стороне самого сервера: у него может истечь сертификат или произойти сбой цепочки. Тогда ошибка повторится у всех и во всех сетях, и остаётся подождать восстановления. Проверьте страницу состояния сервиса, если она у него есть, и повторите попытку позже.
Если вы работаете в закрытой сети с собственным зеркалом пакетов, проверьте, что зеркало настроено с действительным сертификатом, а клиентам известен его центр сертификации. Частая ошибка администраторов: выпустить сертификат для зеркала и не раздать корень пользователям.
Виртуальные окружения и несколько Python
Когда на компьютере установлено несколько версий Python, легко запустить не тот pip. Он использует свой набор сертификатов, и одна версия работает, а другая нет. Запускайте pip как модуль нужного интерпретатора и проверяйте его версию.
В виртуальном окружении набор корневых сертификатов берётся из пакета certifi, установленного в нём. Устаревшая версия этого пакета приводит к отказам, поэтому обновление certifi и самого pip часто решает задачу. Если обновить не выходит, скачайте актуальный пакет на другой машине или временно используйте систему, где всё работает, а затем разберитесь с причиной, не откладывая.