Проверка SSL-сертификата Python не выполняется для некоторых команд распределения

Я пытаюсь загрузить файл Python в PyPi через twine upload <file>, но получаю ошибку SSL:

C:\pypubsub>twine upload dist\PyPubSub-4.0.0rc1-py3-none-any.whl
Uploading distributions to https://upload.pypi.org/legacy/
Uploading PyPubSub-4.0.0rc1-py3-none-any.whl
SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:645)

Другие сценарии Python, использующие SSL, имеют ту же проблему, например

  • с python setup.py bdist_wheel upload <my_package>
  • с pip install <any_package>; но там я могу добавить --trusted-host pypi.python.org к любой pip install команде и установка и загрузка зависимостей пройдет успешно

Это происходит на моем корпоративном ноутбуке дома или на работе, но не на моем личном ноутбуке.

Чтобы обойти это, я в основном пытался SO ответить на аналогичную проблему ( т.е. экспортировать сертификат, который шпагат пытается проверить — предположительно, сертификат pypi.python.org — и затем указать шпагату использовать его):

  1. из Chrome я перешел на https://pypi.pythong.org, щелкнул замок рядом с URL-адресом, затем «Подробности», «Просмотр сертификата», «Подробности», «Копировать в файл». Это сгенерировало файл .CER.
  2. Я использовал SSL Converter для преобразования файла .CER из формата DER в формат PEM. Это создало файл .CRT.
  3. Я бегал по шпагату как twine upload <my_package> --cert <path to CRT file>; на этот раз ошибка SSL была SSLError: [SSL] PEM lib (_ssl.c:2846).

Затем я попытался отказаться от проверки сертификата сервера, исправив c:\Python35\lib\ssl.py, как описано в Отказ: я заменил строку _create_default_https_context = create_default_context на _create_default_https_context = _create_unverified_context. Повторный запуск команды twine снова завершился неудачей с исходной ошибкой CERTIFICATE_VERIFY_FAILED.

Я не очень хорошо знаком с сертификатами, поэтому теперь я в недоумении, что еще попробовать.


person Oliver    schedule 11.10.2016    source источник


Ответы (1)


Вы можете передать флаг --cert, чтобы сообщить twine, какой сертификат использовать.

twine upload dist\PyPubSub-4.0.0rc1-py3-none-any.whl --cert <path-to-.pem-file>

Чтобы преобразовать файл .cer в файл .pem, сделайте следующее.

openssl x509 -inform der -in certificate.cer -out certificate.pem

Флаг --cert важен для тех, кто использует пользовательские сертификаты ssl. Если вы используете корпоративную сеть, указанное выше исправление должно помочь вам. Попросите у администратора сертификаты ssl :)

person Karanja Denis    schedule 11.09.2017
comment
Спасибо @karanja за ответ. Но похоже, что это подтверждает, что шаги с 1 по 3 моего поста должны были сработать, но, может быть, я неправильно сделал шаг 2? - person Oliver; 13.09.2017
comment
@Schollii, ты за корпоративным брандмауэром? Если да, есть ли у вас доступ к сертификатам https ssl? Вам нужно преобразовать файл .cer в файл .pem. - person Karanja Denis; 13.09.2017
comment
поэтому мне нужно получить сертификаты https ssl от нашего ИТ? так что это набор сертификатов ssl, а не только для того сайта, с которым у меня проблемы? - person Oliver; 19.09.2017
comment
@Schollii Да, просто попросите файл сертификата https в своем ИТ-отделе. Я полагаю, что он уже установлен на вашем компьютере, если он нестандартный. - person Karanja Denis; 19.09.2017
comment
Спасибо за ответ. Последние два часа я ломал голову, как это исправить. - person conetfun; 25.06.2019