2012-02-01 10 views
6

Sia il client che il server sono interni, ognuno ha un certificato firmato dalla CA interna e il certificato CA. Ho bisogno che il client autentifichi il certificato del server rispetto al certificato CA che ha. Dovrebbe anche inviare il suo certificato al server per l'autenticazione.Come creare un client HTTPS a doppia autenticazione in Python senza librerie GPL (L)?

Il manuale urllib2 indica che l'autenticazione del server non viene eseguita. PycURL è un'alternativa naturale ma la sua licenza non è ancora stata approvata. Preferirei anche non dover compilare la libreria dal codice sorgente ma utilizzare invece RPM.

sono andato su un mucchio di librerie come richieste, httplib2 e non vedono quello che mi serve. C'è anche il modulo ssl ma non mi sento di implementare http se non devo assolutamente farlo.

Python 2.6 su RHEL 5.7

+0

Sono di fronte problema quasi simile e ho risolto da lasciando Apache fare tutto il sollevamento SSL –

+0

@Mikko - il mio problema è sul lato client che un'utilità Python – davka

+0

Aha. Scusa non l'ho ricevuto la prima volta :( –

risposta

6

beh, il vincitore (quasi) è httplib2 v0.7. A partire da questa versione supporta l'autenticazione del certificato SSL. Ecco il codice di esempio

import httplib2 
client = httplib2.Http(ca_certs='ca.crt') 
client.add_certificate(key='client_private_key.pem', cert='cert_client.pem', domain='') 
headers, resp = client.request(query) 

Nota il parametro domain='', non ha funzionato per me altrimenti.

PS. sfortunatamente questa semplice soluzione non funziona per me, dato che ho dimenticato di menzionare requisiti aggiuntivi: avere l'installazione RPM per RHEL 5.7 & Python 2.6.

+1

Vorrei, avrei potuto revocare questa risposta di più.Ho provato le richieste Python, urllib3 tutto senza successo.Ma funziona !. Ho trovato un nuova libreria fav. – Komu

3

Twisted Python è una libreria che può fare ciò che è necessario, anche se non sono sicuro se la licenza MIT si adatta ciò che si desidera. GPL è una licenza piuttosto specifica e spero che tu non intendessi "tutte le licenze open source".

Per gli esempi SSL, vedere http://twistedmatrix.com/documents/current/core/howto/ssl.html. Gli ultimi due esempi su quella pagina sono particolarmente rilevanti in base alla tua descrizione. Twisted utilizza PyOpenSSL (docs) con licenza Apache. Potresti considerare di usare PyOpenSSL direttamente.

+0

grazie. Sembra interessante ma mi sembra eccessivo - ho bisogno di una semplice richiesta e risposta, quindi usare il reattore in questo caso sarebbe eccessivamente ingegneristico – davka

+0

Forse. sentire la struttura è troppo da mordere in un blocco, utilizzare la libreria PyOpenSSL (link sopra) e farlo a mano.Penso che troverai il livello di sforzo per essere simile in entrambi i casi però. – gfortune

+0

Ho intenzione di provate il 'httplib2' che sembra adatto e semplice.Vorrei aggiornare qui come è andata – davka

2

Aggiornamento: Se requests non hanno sostenuto i certificati lato client prima, it supports it now, purché la chiave privata del CERT locale (se presente) è in chiaro:

>>> requests.get('https://FOO.BAR.BAZ/', cert=('/path/client.cert', '/path/client.key')) 
<Response [200]>