web-dev-qa-db-ja.com

最新の依存関係にもかかわらず、PythonリクエストのSSLエラー

SSLの「不正なハンドシェイク」エラーが表示されます。この問題に対する最も類似した応答は、1024bit certの古いライブラリに由来するようです。非互換性など... Ithink私は最新であり、このエラーが発生する理由がわかりません。

セットアップ:

  • リクエスト2.13.0
  • certifi 2017.01.23
  • 「OpenSSL 1.0.2g 2016年3月1日」

このAPI(2048ビットの証明書キー)にアクセスしています: https://api.sidecar.io/rest/v1/provision/application/device/count/

そして、このエラーを取得:requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')],)",)

https://github.com/sidecar-io/sidecar-python-sdk/blob/master/sidecar.py のl.44を参照してください

verify=Falseリクエストでは、バイパスできますが、認証が失敗する理由を理解したいです。

どんな助けも大歓迎です。ありがとう!

11
N. Masson

アクセスするサーバーが不適切にセットアップされているため、つまり、セットアップまたはコードの問題ではないため、検証は失敗します。 SSLLabsからのレポート を見る

このサーバーの証明書チェーンは不完全です。 Bを上限とするグレード.

これは、サーバーが信頼されたルートに中間証明書がない証明書チェーンを送信するため、クライアントが信頼チェーンを構築できないことを意味します。ほとんどのデスクトップブラウザは、他の場所から不足している証明書を取得しようとすることでこの問題を回避しますが、この場合、通常のTLSライブラリは失敗します。この問題を回避するには、不足しているチェーン証明書を信頼できるものとして明示的に追加する必要があります。

import requests
requests.get('https://api.sidecar.io', verify = 'mycerts.pem')

mycerts.pemには、欠落している中間証明書と信頼されたルート証明書が含まれている必要があります。 mycerts.pemのテスト済みバージョンは http://Pastebin.com/aZSKfyb7 にあります。

13
Steffen Ullrich

これは、問題の回避策として役立つ場合があります。

print(requests.get(url, proxies,verify = False))
6
Shadkhan