2016-03-16 19 views
7

Ho un codice come di seguito:SSL per la versione più vecchia di pitone

headers = {'content-type': 'ContentType.APPLICATION_XML'} 
uri = "www.client.url.com/hit-here/" 
clientCert = "path/to/cert/abc.crt" 
clientKey = "path/to/key/abc.key" 
PROTOCOL = ssl.PROTOCOL_TLSv1 
context = ssl.SSLContext(PROTOCOL) 
context.load_default_certs() 
context.load_cert_chain(clientCert, clientKey) 
conn = httplib.HTTPSConnection(uri, some_port, context=context) 

io non sono davvero un programmatore di rete, così ho fatto qualche googling per la connessione stretta di mano e ho trovato ssl.SSLContext(PROTOCOL) come la funzione necessaria, il codice funziona bene .

Quindi ho colpito il roadblock, il mio locale ha versione 2.7.10 ma tutte le caselle di produzione hanno 2.7.3 con esse, quindi SSLContext non è supportato e l'aggiornamento della versione python non è un'opzione/in controllo.

Ho provato a leggere ssl — SSL wrapper for socket objects ma non ho potuto dare un senso.

quello che ho provato (invano):

s_ = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s = ssl.wrap_socket(s_, keyfile=clientKey, certfile=clientCert, cert_reqs=ssl.CERT_REQUIRED) 
new_conn = s.connect((uri, some_port)) 

ma ritorna:

SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)') 

Domanda - come generare il contesto SSL su versione precedente in modo da avere una sicura HTTPS connessione?

+1

Non penso che la versione precedente possa funzionare con un contesto. Hai provato a creare la connessione https specificando i certificati, ad esempio conn = httplib.HTTPSConnection (host, porta, key_file, cert_file, strict, timeout) –

risposta

0

È necessario specificare il file ca_certs (che dovrebbe puntare ad avere fiducia negozio)

+0

puoi elaborare un po 'di più? – NoobEditor

+0

Per avere fiducia nel certificato del server è necessario avere il certificato ca del server. Quindi il tuo wrap_socket dovrebbe essere come ssl.wrap_socket (s_, keyfile = clientKey, certfile = clientCert, ca_certs = cacertfile cert_reqs = ssl.CERT_REQUIRED) –

0

Ho la soluzione perfetta con il requests library. La libreria delle richieste deve essere la mia libreria preferita che abbia mai usato, perché in Python ci vuole qualcosa che è intrinsecamente difficile da fare - richieste SSL e REST - e lo rende incredibilmente semplice. Ho controllato il loro supporto per la versione e Python 2.6+ è supportato.

Ecco un esempio di come utilizzare la libreria.

>>> requests.get(uri) 

E questo è tutto quello che dovete fare. La libreria delle richieste si occupa di stabilire una connessione SSL.


Prendendo questo un altro passo avanti. Se è necessario mantenere i cookie tra le richieste, è possibile farlo in questo modo.

>>> sess = requests.Session() 
>>> credentials = {"username": "user", 
        "password": "pass"} 
>>> sess.post("https://some-website/login", params=credentials) 
<Response [200]> 
>>> sess.get("https://some-website/a-backend-page").text 
<html> the backend page... </html> 

Edit: Se è necessario, è anche possibile pass in the path to the certificate and the key in questo modo requests.get(uri, cert=('path/to/cert/abc.crt', 'path/to/key/abc.key'))


Ora si spera si può convincerli ad installare la libreria richieste sulle scatole di produzione, la causa sarebbe ne varrà la pena. Fammi sapere se questo funziona per te.

+0

request.get non supporta chiavi crittografate e doc request.post non ha alcun cert/documentazione chiave ... qualsiasi pensiero amico? – NoobEditor

+0

Dang it.Beh, non posso pensare ad altri modi per farlo, ma se lo farò, ti farò sapere. –

Problemi correlati