Вопрос или проблема
Информация о системе:
ОС: 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 для скачивания файла.
Испробованные решения:
- Обновление между версиями Python 3.10
- Добавление Python.exe в исключения брандмауэра, как для публичной, так и для частной сетей.
- Переустановка Python 3.10.x
- Запуск
python -m pip install pip-system-certs --use-feature=truststore
иpython -m pip install pip-system-certs -U --use-feature=truststore
как в виртуальной, так и в не виртуальной среде. - Запуск
pip install --upgrade certifi
(бесполезно, так как Python только что был установлен). - Запуск
pip install pip-system-certs
(снова бесполезно). - Форматирование Windows, переустановка Python в чистой среде.
Нереализуемые решения:
- Найти
команду установки сертификата
и установить. Это для MacOS, я на Windows. - Отключить проверку SSL. Это НЕ безопасно.
- Вручную отключить проверку сертификата, редактируя код. Это происходит с КАЖДЫМ репозиторием, который использует
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-сертификата, используемого целевым веб-сайтом, поскольку не может получить необходимый локальный корневой сертификат.
Возможные причины
- Отсутствующие или устаревшие корневые сертификаты. На вашем компьютере может не быть актуальных сертификатов или они могут отсутствовать вообще.
- Настройки Python. В некоторых установках Python может отсутствовать интеграция с системными сертификатами.
- Сетевые ограничения. В некоторых случаях брандмауэр или прокси-сервер может блокировать запросы SSL.
Рекомендуемые решения
-
Установка корневых сертификатов:
- Чтобы удостовериться, что у вас установлены все необходимые сертификаты, вы можете использовать
certifi
:pip install certifi
- Чтобы удостовериться, что у вас установлены все необходимые сертификаты, вы можете использовать
-
Использование
pip-system-certs
:- Убедитесь, что пакет
pip-system-certs
установлен для интеграции системных сертификатов:python -m pip install pip-system-certs --use-feature=truststore
- Убедитесь, что пакет
-
Обновление
certifi
:- Убедитесь, что у вас последняя версия
certifi
, так как она включает актуальные сертификаты:pip install --upgrade certifi
- Убедитесь, что у вас последняя версия
-
Переустановка Python:
- Если вышеуказанные шаги не помогли, попробуйте полностью удалить и переустановить Python и при этом выбрать опцию установки для добавления Python в системный PATH.
-
Обновление Windows:
- Убедитесь, что ваша операционная система Windows обновлена. Установите все доступные обновления, так как они могут содержать обновления для сертификатов.
-
Настройка переменной окружения:
- Иногда установка переменной окружения
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 или техническому специалисту для более глубокой диагностики вашей системы.