2016-09-21 5 views
3

Это последующая информация о previous SO post.Python (пип) бросает [SSL: CERTIFICATE_VERIFY_FAILED], даже если обновлена ​​цепочка сертификатов

Я использую Windows/cygwin, и мне нужно, чтобы python понимал пользовательский сертификат ЦС, поскольку сетевая инфраструктура отменила все запросы SSL со своим собственным сертификатом.

Если я пытаюсь запустить pip search SimpleHTTPServer, я получаю следующее сообщение об ошибке:

... 
    File "c:\users\erbe\appdata\local\programs\python\python35-32\lib\ssl.py", line 633, in do_handshake 
    self._sslobj.do_handshake() 
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:645) 

Я пытался добавить сертификаты в список доверенных сертификатов, выполнив следующие действия:

  1. Copy мой .pem файл в/и т.д./PKI/CA-доверительном/источника/якоря
  2. update-ca-trust extract

Я проверил, что это работает, как я теперь могу указать сгенерированный файл PEM и запустить пип успешно: pip --cert /usr/local/ssl/cert.pem search SimpleHTTPServer:

$ pip --cert tls-ca-bundle.pem search SimpleHTTPServer 
ComplexHTTPServer (0.1)  - A Multithreaded Python SimpleHTTPServer 
SimpleTornadoServer (1.0) - better SimpleHTTPServer using tornado 
rangehttpserver (1.2.0)  - SimpleHTTPServer with support for Range requests 

Однако, я хочу, чтобы это работало без указания сертификата вручную каждый раз. Я надеюсь, чтобы обновить цепочку сертификатов, питон использует:

$ python -c "import ssl; print(ssl.get_default_verify_paths())" 
DefaultVerifyPaths(cafile=None, capath=None, openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/usr/local/ssl/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='/usr/local/ssl/certs') 

Я проверил, что через ряд симлинками, что /usr/local/ssl/cert.pem указывает на тот же файл. Однако, если я выполняю pip, я все равно получаю сообщение об ошибке [SSL: CERTIFICATE_VERIFY_FAILED].

Я удалил версию python для Windows и переустановил версию python для Cygwin. С этим я побежал easy_install-2.7 pip. Теперь, по крайней мере, я могу выполнить пип с указанием полного пути сертификата без сообщения об ошибке:

$ pip --cert /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem search simpleHttpServer 
LittleHTTPServer (0.5.0)  - Little bit extended SimpleHTTPServer 
SimpleHTTP404Server (0.2.0) - A Python SimpleHTTPServer, but serves 404.html if a page is not found. 
django-localsrv (0.1.2)  - Django app for serving static content from different sources (files, strings, urls, etc.) at custom paths, 

Просто чтобы быть в безопасности, я также попытался обновить SSL_CERT_DIR Название переменной, чтобы указать на/и т.д./ИПК/ча-trust- извлеченный/PEM и установите SSL_CERT_FILE в /etc/pki/ca-trust-extracted/pem/tls-ca-bundle.pem, но они не работают:

$ set | grep SSL 
SSL_CERT_DIR=/etc/pki/ca-trust/extracted/pem 
SSL_CERT_FILE=/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem 

$ python -c "import ssl; print(ssl.get_default_verify_paths())" 
DefaultVerifyPaths(cafile='/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem', capath='/etc/pki/ca-trust/extracted/pem', openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/usr/ssl/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='/usr/ssl/certs') 


$ pip search simpleHttpServer 
Exception: 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/site-packages/pip-8.1.2-py2.7.egg/pip/basecommand.py", line 215, in main 
    status = self.run(options, args) 
    ... 
    ... 
    File "/usr/lib/python2.7/site-packages/pip-8.1.2-py2.7.egg/pip/_vendor/requests/adapters.py", line 477, in send 
    raise SSLError(e, request=request) 
SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590) 

Что я делаю неправильно? Это проблема cygwin vs Windows? Какие файлы PEM необходимо обновить?

+0

Какие пип версии? –

+0

Я использую pip 8.1.2. 'pip 8.1.2 из/usr/lib/python2.7/site-packages/pip-8.1.2-py2.7.egg' –

+0

@KlausD. Я обновил свой вопрос, указав, что с тех пор я удалил Windows Python и установил его только через cygwin, но безрезультатно. –

ответ

4

Вы можете добавить опцию командной строки pip по умолчанию в свой файл конфигурации. В окнах он должен находиться в папке% APPDATA% \ pip \ pip.ini.

Чтобы добавить сертификат, добавьте следующие строки в файле:

[global] 
cert = windows path to your certificate 
+0

Я отказался от попыток получить версию python для окон, работающих с этим путем. Я просто удалил его и переустановил Cygwin версию python 2.7 и установил pip с помощью easy_install. Но я до сих пор не могу заставить vs SSL_CERT_DIR/SSL_CERT_FILE работать. –

+2

Под Linux файл conf conf находится под $ HOME/.config/pip/pip.conf или $ HOME/.pip/pip.conf. – jerry

+2

Отлично. Работает как описано.Однако почему пип не использует один и тот же хранилище доверия CA как питон? –