ほぼ同一の 2 つのシステム (両方とも Fedora 25 を実行し、両方とも同様のパッケージ バージョンがインストールされている) で、一方のシステムは 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 証明書が不足しているだけだと思いましたが、python を実行すると、失敗したシステムで python がca bundle を開こうとしていないことstrace
がわかりました。つまり、動作するシステムでは次のようになります。
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)
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
しかし、失敗したシステムでは次のようになります。
open("/etc/pki/tls/legacy-settings", O_RDONLY) = -1 ENOENT (No such file or directory)
python3
さらに、失敗したシステムで同じテスト スクリプトを実行すると...動作します!
どちらの場合も、python
から/usr/bin/python
ですpython-2.7.13-1.fc25.x86_64
。どちらのシステムも*_CA_BUNDLE
環境変数を設定していません。