2016-06-24 47 views
6

Python ve istekleri kullanarak bazı dahili sayfaları çiziyorum. SSL doğrulamalarını ve uyarılarını kapattım.Python - requests.exceptions.SSLError - dh tuşu çok küçük

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

Bazı sunucularda bir SSL hatası alıyorum, geçemiyorum.

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) 

Bu, Windows ve OSX'te Cygwin'in hem içinde/dışında gerçekleşir. Araştırmam, sunucudaki güncel olmayan OpenSSL'de ima etti. İdeal bir çözüm müşterisi arıyorum.

Düzenleme

: Ben bir şifre kullanarak bu sorunu çözmek için başardı

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

varsa uyarıyı devre dışı bırakmak için ithal edilebilir? SSL sertifikasının bir sorunu varsa, HTTP'yi kullanmak veya sorunu göz ardı ederken HTTPS kullanmaya devam etmek ister misiniz? –

+0

@MarcelWilson: Bu bir sertifika sorunu değil. –

+0

@SteffenUllrich Elbette haklısınız. 'SSL' jenerik bir sorun varsa belirtmeliydim. –

cevap

4

devre dışı bırakılması uyarıları ayarlamak veya sertifika doğrulama yardımcı olmayacaktır. Temel sorun, sunucu tarafından Logjam Attack'da kötüye kullanılabilecek zayıf bir DH anahtardır.

Eğer Diffie Hellman Anahtar Değişimi herhangi yararlanmaz bir şifre seçmeniz gerekir Bu sorunu gidermek için ve bu nedenle zayıf DH anahtarının etkilenmez. Ve bu şifre sunucu tarafından desteklenmelidir. Sunucunun neyi desteklediği bilinmemekle birlikte, AES128-SHA şifresiyle veya HIGH:!DH:!aNULL şifreleme seti ile deneyebilirsiniz. Kendi şifre setinizle istekleri kullanmak zordur. Örnek için Why does Python requests ignore the verify parameter?'a bakın.

+0

Öneriniz için teşekkür ederiz, şifre setini ve sağlanan gönderiyi kullanarak bu hataları geçebildim. – Feocco

2

bu sadece ekstra bilgi Böylece diğerleri kopyalayabilirsiniz ile sorudan çözüm kodunu birleştirmeyi deneyin ekstra cevap değil doğrudan ekstra olmadan denemek

Bu sunucu tarafında bir DH sadece kilit konular olduğunu, fakat aynı zamanda pek çok farklı kütüphane python modüllerinde uyuşmuyor. o sunucu tarafında çözülmesi mümkün olmayabilir çünkü aşağıda

Kod segmenti olanlar securitry sorunlarını görmezden kullanılır. Örneğin, iç eski sunucu ise, kimse onu güncellemek istemiyor. 'HIGH:!DH:!aNULL' için saldırıya uğramış dize yanında

, urllib3 modülü Aradığınız düzeltme ne tür

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)