2016-11-22 7 views
1

は私にエラーを与えるmanyhavehadPythonの要求は私を与える "悪いハンドシェイク" エラー

SSLError: ("bad handshake: Error([('SSL routines', 'SSL23_GET_SERVER_HELLO', 'sslv3 alert handshake failure')],)",) 

しかし、不足しているパッケージのいずれもが、彼らは作品を示唆していません。 verify=Falseと設定しても同じエラーが出ます。 同じサイトにアクセスしようとすると、Curlはエラーを表示しません。

バージョン:

  • アルパイン3.4
  • 要求2.12.1(それは2.11.1で動作します)
  • のOpenSSL 1.0.2j 2016年9月26日

答えて

5

最も可能性の高いエラーがありますそのrequestsとサーバーが使用する暗号をネゴシエートできません。

カールの使用状況を確認します。

curl --verbose https://internal.site.no/ 

それはあなたに大量の出力が得られますが、あなたが探している一つがSSL connection using TLSv1.2/ECDHE-RSA-AES128-GCM-SHA256のようなものです。

リクエストの2.11.1 to 2.12.0からの差分を見ると、urllib3(バージョン1.19まで)の新しいバージョンが表示されます。たぶん、removal of 3desここにあなたを刺すでしょうか?

curl --verbose ...アウトプット暗号をthis暗号名​​マッピングの有用なリストと照合する場合。あなたは(あなたのアプリ/スクリプトの先頭でこれを行うことができます)たとえば、受け入れrequestsものに名前のopenssl名前を追加してみてくださいすることができます

import requests 
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS += ':ADH-AES128-SHA256' 

カールはそれとして(TLS_DH_anon_WITH_AES_128_CBC_SHA256を使用していることを示している場合例)。

もう一つの便利なヒントは、このように、nmapのスクリプトssl-enum-ciphersを使用することです:

1
...(スクリプトがうるさいかもしれない、注意してください)、それがサポートされる暗号として見つかったもののリストを取得するために

nmap --script ssl-enum-ciphers -p 443 internal.site.no 

私も同じ問題がありました。ご使用のバージョンのリクエストを確認してください。

import requests 
print requests.__version__ 

バージョン2.11.1にダウングレードする必要があります。私はこれをして、私の問題を解決しました。これを行うには、端末で次のコマンドを発行してください。

pip uninstall requests 
pip install requests==2.11.1 

希望します。

+0

それからおそらくあなたを噛んでいたurllib3から3desが削除されている可能性があります。 diffの私の答えのリンク。私は、urllib3の 'DEFAULT_CIPHERS'を古いバージョンに固執するよりも、より良い解決策だと思います。問題は、私たちがthoと話している 'https'サーバにあります。3desが出てこない理由は次のとおりです。:) – xeor

+0

これが答えです。 – Bhargav

関連する問題