Ошибка Python urllib: Проверка SSL-сертификата не удалась, невозможно получить локальный сертификат удостоверяющего центра.

Вопрос или проблема

Информация о системе:

ОС: Windows 10 LTSC iot
Версия Python: 3.10.X

Краткое описание проблемы:

Любое приложение, которое я запускаю, или репозиторий, который я клонирую и который в какой-либо степени зависит от библиотеки urllib, выдает ошибку при попытке скачать файл с вебсайта.
Ошибка выглядит следующим образом:

  File "C:\Python310\lib\urllib\request.py", line 216, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Python310\lib\urllib\request.py", line 525, in open
    response = meth(req, response)
  File "C:\Python310\lib\urllib\request.py", line 634, in http_response
    response = self.parent.error(
  File "C:\Python310\lib\urllib\request.py", line 557, in error
    result = self._call_chain(*args)
  File "C:\Python310\lib\urllib\request.py", line 496, in _call_chain
    result = func(*args)
  File "C:\Python310\lib\urllib\request.py", line 749, in http_error_302
    return self.parent.open(new, timeout=req.timeout)
  File "C:\Python310\lib\urllib\request.py", line 519, in open
    response = self._open(req, data)
  File "C:\Python310\lib\urllib\request.py", line 536, in _open
    result = self._call_chain(self.handle_open, protocol, protocol +
  File "C:\Python310\lib\urllib\request.py", line 496, in _call_chain
    result = func(*args)
  File "C:\Python310\lib\urllib\request.py", line 1391, in https_open
    return self.do_open(http.client.HTTPSConnection, req,
  File "C:\Python310\lib\urllib\request.py", line 1351, in do_open
    raise URLError(err)
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:997)>

Я убедился, что вебсайт в коде работает и доступен, если вручную использовать URL для скачивания файла.

Испробованные решения:

  1. Обновление между версиями Python 3.10
  2. Добавление Python.exe в исключения брандмауэра, как для публичной, так и для частной сетей.
  3. Переустановка Python 3.10.x
  4. Запуск python -m pip install pip-system-certs --use-feature=truststore и python -m pip install pip-system-certs -U --use-feature=truststore как в виртуальной, так и в не виртуальной среде.
  5. Запуск pip install --upgrade certifi (бесполезно, так как Python только что был установлен).
  6. Запуск pip install pip-system-certs (снова бесполезно).
  7. Форматирование Windows, переустановка Python в чистой среде.

Нереализуемые решения:

  1. Найти команду установки сертификата и установить. Это для MacOS, я на Windows.
  2. Отключить проверку SSL. Это НЕ безопасно.
  3. Вручную отключить проверку сертификата, редактируя код. Это происходит с КАЖДЫМ репозиторием, который использует urllib, не только с моим кодом. Это 100% невыполнимо редактировать каждый клонированный репозиторий, чтобы добавить verify=False или использовать альтернативную библиотеку.

Ответ или решение

Ошибка Python urllib: Ошибка проверки SSL-сертификата

Введение

Ваша проблема с использованием библиотеки urllib в Python, которая приводит к ошибке проверки SSL-сертификата, является распространенной среди пользователей Windows. Она может возникать по нескольким причинам, связанным с настройками сертификатов на вашей системе. Давайте подробно рассмотрим возможные причины и решения этой проблемы.

Описание проблемы

Вы упомянули, что при попытке загрузки файла с использованием urllib возникает следующая ошибка:

urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:997)>

Это указывает на то, что Python не может проверить подлинность SSL-сертификата, используемого целевым веб-сайтом, поскольку не может получить необходимый локальный корневой сертификат.

Возможные причины

  1. Отсутствующие или устаревшие корневые сертификаты. На вашем компьютере может не быть актуальных сертификатов или они могут отсутствовать вообще.
  2. Настройки Python. В некоторых установках Python может отсутствовать интеграция с системными сертификатами.
  3. Сетевые ограничения. В некоторых случаях брандмауэр или прокси-сервер может блокировать запросы SSL.

Рекомендуемые решения

  1. Установка корневых сертификатов:

    • Чтобы удостовериться, что у вас установлены все необходимые сертификаты, вы можете использовать certifi:
      pip install certifi
  2. Использование pip-system-certs:

    • Убедитесь, что пакет pip-system-certs установлен для интеграции системных сертификатов:
      python -m pip install pip-system-certs --use-feature=truststore
  3. Обновление certifi:

    • Убедитесь, что у вас последняя версия certifi, так как она включает актуальные сертификаты:
      pip install --upgrade certifi
  4. Переустановка Python:

    • Если вышеуказанные шаги не помогли, попробуйте полностью удалить и переустановить Python и при этом выбрать опцию установки для добавления Python в системный PATH.
  5. Обновление Windows:

    • Убедитесь, что ваша операционная система Windows обновлена. Установите все доступные обновления, так как они могут содержать обновления для сертификатов.
  6. Настройка переменной окружения:

    • Иногда установка переменной окружения SSL_CERT_FILE на путь к cacert.pem из certifi может помочь. Например:
      set SSL_CERT_FILE=C:\Python310\lib\site-packages\certifi\cacert.pem

Альтернативные решения

Если вышеперечисленные не сработают, можно рассмотреть:

  • Использование сторонних библиотек: Вместо urllib, возможно, вы захотите использовать requests, который гораздо проще в использовании и предоставляет лучшие средства для работы с SSL.

  • Контакт с администратором сети: Если ваша система находится в корпоративной сети, возможно, сетевые настройки или политики безопасности мешают подключению. Обсудите проблему с вашим системным администратором.

Заключение

Ошибки, связанные с проверкой SSL-сертификатов, могут быть довольно сложными. Однако, следуя предложенным шагам, вы сможете устранять проблемы и восстановить корректную работу запросов HTTPS в Python. Не забывайте поддерживать актуальность сертификатов, чтобы минимизировать подобные проблемы в будущем. Если проблемы повторяются, возможно, вам стоит обратиться к сообществу Python или техническому специалисту для более глубокой диагностики вашей системы.

Оцените материал
Добавить комментарий

Капча загружается...