2017-04-07 10 views
-1

2つの大部分が同一のシステム(どちらもFedora 25を実行しており、両方とも同様のパッケージバージョンがインストールされています)では、SSL証明書の検証エラーが発生しているシステムがあります。それが動作PythonはコンサルティングシステムのCAバンドルなしでSSL証明書検証エラーを投げていますか?

import requests 
r = requests.get('https://insidehost.corp.example.com') 

一つ一つのシステムを、他にそれが失敗している間:私は実行する場合つまり、まず

requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')],)",) 

私は単純に、必要なCA証明書を逃したが、走っていたことを把握straceの下のpythonは、失敗したシステムでは、pythonはで、CAバンドルを開こうとしていないことを示しています。それが動作するシステム上で、次のとおりです。

strace -e trace=open,stat python testscript.py |& grep /etc/pki 

のみ得られます。さらに

open("/etc/pki/tls/legacy-settings", O_RDONLY) = -1 ENOENT (No such file or directory) 

python3と同じテストスクリプトの実行:

open("/etc/pki/tls/legacy-settings", O_RDONLY) = -1 ENOENT (No such file or directory) 
stat("/etc/pki/tls/certs/ca-bundle.crt", {st_mode=S_IFREG|0444, st_size=257079, ...}) = 0 
open("/etc/pki/tls/certs/ca-bundle.crt", O_RDONLY) = 4 

しかし、障害が発生し、システムの収量に

失敗したシステム...働く!

pythonは、/usr/bin/pythonであり、python-2.7.13-1.fc25.x86_64である。いずれのシステムも環境変数*_CA_BUNDLEを設定していません。

+0

こんにちは-1人目、コメントを残しますか?これはかなり良い質問だと思う。 – larsks

答えて

0

追加の調査をしたところ、わかりました。必ずしも明らかではないので、ここで解決策を投稿すると思いました。

requestsモジュールには独自の証明書バンドルが含まれています。使用する別の証明書バンドルが見つからない場合は、そのモジュールに戻ります。それは、証明書のバンドルの見え方がリクエストで、このようなものです/ certs.py:あなたが実行してこの結果を見ることができます

try: 
    from certifi import where 
except ImportError: 
    def where(): 
     """Return the preferred certificate bundle.""" 
     # vendored bundle inside Requests 
     return os.path.join(os.path.dirname(__file__), 'cacert.pem') 

$ python -m requests.certs 
/etc/pki/tls/certs/ca-bundle.crt 

あなたは上から見ることができるようにコードrequestscertifiモジュールを使用して適切なバンドルを見つけます。問題のシステムでは、certifiモジュールがシステムパッケージを使用するのではなくpip経由でインストールされていたため、適切な構成が不足していました。

溶液はyum install python2-certifiであった。

関連する問題