2016-06-24 34 views
6

私はPythonを使用していくつかの内部ページを掻き集めています。私はSSLの検証と警告を無効にしました。Python - requests.exceptions.SSLError - dhキーが小さすぎる

requests.packages.urllib3.disable_warnings() 
page = requests.get(url, verify=False) 

特定のサーバーでは、SSLエラーが発生しましたが、過去には取得できません。

Traceback (most recent call last): 
    File "scraper.py", line 6, in <module> 
    page = requests.get(url, verify=False) 
    File "/cygdrive/c/Users/jfeocco/VirtualEnv/scraping/lib/python3.4/site-packages/requests/api.py", line 71, in get 
    return request('get', url, params=params, **kwargs) 
    File "/cygdrive/c/Users/jfeocco/VirtualEnv/scraping/lib/python3.4/site-packages/requests/api.py", line 57, in request 
    return session.request(method=method, url=url, **kwargs) 
    File "/cygdrive/c/Users/jfeocco/VirtualEnv/scraping/lib/python3.4/site-packages/requests/sessions.py", line 475, in request 
    resp = self.send(prep, **send_kwargs) 
    File "/cygdrive/c/Users/jfeocco/VirtualEnv/scraping/lib/python3.4/site-packages/requests/sessions.py", line 585, in send 
    r = adapter.send(request, **kwargs) 
    File "/cygdrive/c/Users/jfeocco/VirtualEnv/scraping/lib/python3.4/site-packages/requests/adapters.py", line 477, in send 
    raise SSLError(e, request=request) 
requests.exceptions.SSLError: [SSL: SSL_NEGATIVE_LENGTH] dh key too small (_ssl.c:600) 

これは、Cygwin、WindowsおよびOSXの両方で発生します。私の研究は、サーバー上の古いOpenSSLを暗示していました。私は理想的にクライアント側の修正を探しています。

編集: 私は暗号を使用することによってこの問題を解決することができましたが、警告または証明書の検証が助けにはなりません無効

import requests 

requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS += 'HIGH:!DH:!aNULL' 
try: 
    requests.packages.urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST += 'HIGH:!DH:!aNULL' 
except AttributeError: 
    # no pyopenssl support used/needed/available 
    pass 

page = requests.get(url, verify=False) 
+0

を持っている場合に警告を無効にするには、インポートすることができますか? SSL証明書に問題がある場合は、問題を無視しながらHTTPを使用するか、HTTPSを使用し続けますか? –

+0

@MarcelWilson:これは証明書の問題ではありません。 –

+0

@SteffenUllrichあなたはもちろん正しいです。私は「SSL」が一般的に問題を抱えていると述べるべきだった。 –

答えて

4

を設定します。根本的な問題は、サーバーによって使用される弱いDHキーであり、Logjam Attackで誤用される可能性があります。

この問題を回避するには、Diffie Hellman鍵交換を使用しない暗号を選択する必要があり、弱いDH鍵の影響を受けません。そして、この暗号はサーバーによってサポートされなければなりません。サーバーがサポートしているものは不明ですが、暗号で試す可能性がありますAES128-SHAまたは暗号セットHIGH:!DH:!aNULL

独自の暗号セットでリクエストを使用するのは難しいです。例については、Why does Python requests ignore the verify parameter?を参照してください。

+0

あなたの提案をお寄せいただきありがとうございます。私は暗号セットと提供された投稿を使用してこれらのエラーを回避することができました。 – Feocco

2

これはちょうどそれは、サーバ側でのDHキーの問題だけではありません だから、他の人が余分な試みずに直接

それをコピーすることができ、余分な情報を質問からソリューションコードを結合しようと余分な答えではありませんPythonモジュールでは多くの異なるライブラリが一致しません。

以下のコードセグメントは、サーバー側で解決できない可能性があるため、これらの証券化の問題を無視するために使用されます。たとえば、内部レガシーサーバーの場合、誰もそれを更新する必要はありません。

'HIGH:!DH:!aNULL'のためのハッキング文字列のほか、urllib3モジュールは、それはあなたが探しているの修正はどのような

import requests 
import urllib3 

requests.packages.urllib3.disable_warnings() 
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS += 'HIGH:!DH:!aNULL' 
try: 
    requests.packages.urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST += 'HIGH:!DH:!aNULL' 
except AttributeError: 
    # no pyopenssl support used/needed/available 
    pass 

page = requests.get(url, verify=False) 
関連する問題