2016-09-21 26 views
3

これはprevious SO postへのフォローアップです。証明書チェーンが更新されてもPython(pip)throw [SSL:CERTIFICATE_VERIFY_FAILED]

私はWindows/cygwinを使用しています。ネットワークインフラストラクチャがすべてのSSL要求を独自の証明書で辞退するため、PythonがカスタムCA証明書を理解する必要があります。

私は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. コピーの/ etc/PKI/CA-信託/ソースへの私の.pemファイル/アンカー
  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が使用する証明書チェーンを更新するために期待しています:

$ 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]というエラーメッセージが表示されます。

私はWindows版のpythonをアンインストールし、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のvaraibleを更新しようとしたのは/ etc/PKI/CA-trust- /抽出PEMと/etc/pki/ca-trust-extracted/pem/tls-ca-bundle.pemしたssl_cert_fileを設定するが、これらは動作しません:

$ 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とWindowsの問題ですか?どのPEMファイルを更新する必要がありますか?

+0

バージョンをピップどちら:、証明書を追加ファイルに以下の行を入れて

? –

+0

私はpip 8.1.2を使用しています。 'pip 8.1.2 from/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のWindows版を取得しようとしました。私はそれを削除し、Python 2.7のCygwin版を再インストールし、easy_installを使ってpipをインストールしました。しかし、私はまだSSL_CERT_DIR/SSL_CERT_FILE varsを動作させることができません。 –

+2

Linuxのpip confファイルは、$ HOME/.config/pip/pip.confまたは$ HOME/.pip/pip.confの下にあります。 – jerry

+2

優れています。説明したように動作します。しかし、pipがpythonと同じCAの信頼ストアを使用しないのはなぜですか? –

関連する問題