2016-06-24 12 views
6

Sto raschiando alcune pagine interne usando Python e richieste. Ho disattivato le verifiche SSL e gli avvisi.Python - requests.exceptions.SSLError - chiave dh troppo piccola

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

Su determinati server, ricevo un errore SSL che non riesco a superare.

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) 

Questo accade sia in entrata/uscita da Cygwin, in Windows e OSX. La mia ricerca ha suggerito OpenSSL obsoleto sul server. Sto cercando idealmente un lato cliente fisso.

Edit: sono stato in grado di risolvere questo utilizzando un cifrario set

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

Che tipo di correzione stai cercando? Se il certificato SSL ha un problema, si desidera utilizzare HTTP o continuare a utilizzare HTTPS ignorando il problema? –

+0

@ MarcelWilson: questo non è un problema del certificato. –

+0

@SteffenUllrich Ovviamente hai ragione. Avrei dovuto dire se "SSL" genericamente ha un problema. –

risposta

4

avvertimenti disattivazione o la convalida del certificato non aiuterà. Il problema sottostante è una debole chiave DH utilizzata dal server che può essere utilizzata in modo errato nello Logjam Attack.

Per ovviare a questo è necessario scegliere un codice che non fa alcun uso di Diffie Hellman Key Exchange e quindi non è influenzato dal debole tasto DH. E questa cifra deve essere supportata dal server. Non si sa cosa supporti il ​​server ma si potrebbe provare con il codice AES128-SHA o un set di codici HIGH:!DH:!aNULL

L'utilizzo di richieste con il proprio set di crittografia è complicato. Vedere Why does Python requests ignore the verify parameter? per un esempio.

+0

Grazie per il tuo suggerimento, sono riuscito a superare questi errori utilizzando il set di cifratura e il post fornito. – Feocco

2

questa non è una risposta in più solo cercare di combinare il codice della soluzione da domanda di informazioni aggiuntive così gli altri possono copiare direttamente senza più provare

E non è solo un DH questioni chiave nel lato server, ma anche molte librerie diverse non corrispondono ai moduli python.

Il segmento di codice riportato di seguito viene utilizzato per ignorare tali problemi di sicurezza perché potrebbe non essere possibile risolverlo sul lato server. Ad esempio, se è un server legacy interno, nessuno vuole aggiornarlo.

Oltre la stringa inciso per 'HIGH:!DH:!aNULL', modulo urllib3 possono essere importati per disattivare l'avviso se ha

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) 
Problemi correlati