Python 2.7.9では、SSL証明書の検証がより厳しくなりました。驚くばかり!Python Urllib2 SSLエラー
以前に動作していたプログラムがCERTIFICATE_VERIFY_FAILEDエラーを取得していることに驚くことはありません。しかし、証明書の検証を完全に無効にすることなく、それらを動作させることはできません。
1つのプログラムが、urllib2を使用してhttpsでAmazon S3に接続していました。
私は「verisign.pem」と呼ばれるファイルにルートCA証明書をダウンロードし、この試してみてください。ルートCAは、4行目で正しく印刷されていても、
import urllib2, ssl
context = ssl.create_default_context()
context.load_verify_locations(cafile = "./verisign.pem")
print context.get_ca_certs()
urllib2.urlopen("https://bucket.s3.amazonaws.com/", context=context)
をし、私はまだCERTIFICATE_VERIFY_FAILEDエラーが発生します。
opensslはこのサーバに正常に接続できます。実際には、ここで私はCA証明書を取得するために使用するコマンドは次のとおりです。
openssl s_client -showcerts -connect bucket.s3.amazonaws.com:443 < /dev/null
私はチェーン内の最後の証明書を取り、OpenSSLが読み込めるPEMファイルにそれを置きます。 Verisignの証明書:
Serial number: 35:97:31:87:f3:87:3a:07:32:7e:ce:58:0c:9b:7e:da
Subject key identifier: 7F:D3:65:A7:C2:DD:EC:BB:F0:30:09:F3:43:39:FA:02:AF:33:31:33
SHA1 fingerprint: F4:A8:0A:0C:D1:E6:CF:19:0B:8C:BC:6F:BC:99:17:11:D4:82:C9:D0
この検証を有効にする方法はありますか?
どの証明書がverisign.pemにありますか? SHA1の証明書であることを確認してください。A1:DB:63:93:91:6F:17:E4:18:55:09:40:04:15:C7:02:40:B0:AE:6B 3C:D5:78:49:9B:1C:CF:5F:58:1E:AD:56:BE:3D:9B:67:44(クラス3パブリックプライマリ認証局) :A5:E5'(VeriSignクラス3公開プライマリ認証局 - G5) –
私はついにそれが見つかった、ありがとう! どのルート証明書が使用されているかをどのように知ることができますか?私はopenssl x509コマンドを使ってチェーン内の各certをダンプしています。彼らのほとんどは署名された証明書を言っていますが、どこに最後の証明書が署名されたのかは分かりません。 – abjennings