2015-03-19 22 views
10

Sono bloccato utilizzando Python 2.6 e devo inviare una richiesta di post utilizzando TLS 1.2. La libreria requests di Python 2.6 supporta TLS 1.2? Come faccio a garantire/verificare che la richiesta venga effettuata tramite TLS1.2 e non qualche altra versione?Invio richiesta TLS 1.2 in Python 2.6

Una richiesta del campione è

r=requests.post(url,data=payload,verify=False) 

Da qualche parte sul forum sono venuto a sapere che abbiamo bisogno di compilare pyOpenSSL a sostegno di questa. C'è un modo più semplice?

risposta

10

Il modulo ssl in Python 2.6 supporta solo fino a TLS 1.0. Se non desideri introdurre ulteriori dipendenze (come pyOpenSSL come suggerisci), dovrai eseguire l'aggiornamento a Python 2.7 o 3.x per ottenere supporto per le versioni più recenti di TLS.

Per imporre una particolare versione di TLS in Python 2.7.9 o successiva, construct an SSLContext con l'appropriato PROTOCOL_* constant. È quindi possibile utilizzarlo con qualsiasi API che consente di fornire il proprio SSLContext.

import ssl 
import urllib2 

ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) 
# set other SSLContext options you might need 
response = urllib2.urlopen(url, context=ctx) 

di utilizzare una particolare versione del protocollo o superiore (comprese le versioni future), utilizzare ssl.PROTOCOL_SSLv23 e quindi disattivare la versione di protocollo non si vuole utilizzare:

ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23) 

# allow TLS 1.2 and later 
ctx.options |= ssl.OP_NO_SSLv2 
ctx.options |= ssl.OP_NO_SSLv3 
ctx.options |= ssl.OP_NO_TLSv1 
ctx.options |= ssl.OP_NO_TLSv1_1 

Come per l'utilizzo di un personalizzato SSLContext con Richieste per forzare una particolare versione di protocollo, according to the documentation non sembra essere un modo per farlo , see the following example from the docs.

+0

Grazie a @frasertweedale. Come posso specificare la versione di TLS durante l'invio della richiesta? – MultipleCrashes

+0

Risposta aggiornata con ulteriori informazioni e esempi di codice del modulo 'ssl'. Sfortunatamente non sembra esserci un modo per farlo con la libreria Richieste. – frasertweedale

+0

E se il server impone la richiesta di TLS 1.2 sarà possibile con la libreria delle richieste in python? Nel mio caso quando ho catturato il pacchetto usando wireshark, ho osservato che la richiesta che stava uscendo dalla macchina client era TLS 1.0 ma i pacchetti catturati sul server erano TLS 1.2. Non sono in grado di capirlo da quando ho inviato una richiesta tramite protocollo e non tramite porta specifica, il server e il client stanno negoziando per comunicare tramite TLS 1.2. Questo link dice che https://luxsci.com/blog/ssl-versus-tls-whats-the-difference.html – MultipleCrashes