2010-04-13 3 views
5

Sto provando a utilizzare HTTPSConnection di httplib per la convalida del client, utilizzando un certificato PKCS # 12. So che il certificato è buono, in quanto posso connettermi al server che lo utilizza in MSIE e Firefox.Errore nell'utilizzo di HTTPSConnection di httlib con certificato PKCS # 12

Ecco la mia funzione di connessione (il certificato include la chiave privata). Ho Pared verso il basso per solo le basi:

def connect(self, cert_file, host, usrname, passwd): 
    self.cert_file = cert_file 
    self.host = host 

    self.conn = httplib.HTTPSConnection(host=self.host, port=self.port, key_file=cert_file, cert_file=cert_file) 

    self.conn.putrequest('GET', 'pathnet/,DanaInfo=200.222.1.1+') 
    self.conn.endheaders() 
    retCreateCon = self.conn.getresponse() 

    if is_verbose: 
     print "Create HTTPS connection, " + retCreateCon.read() 

(Nota: Non ci sono commenti sul percorso hard-coded, si prega - Sto cercando di arrivare a questo lavoro prima, ce la farò abbastanza tardi Il percorso hard-coded è corretto, come mi collego ad esso in MSIE e Firefox.Ho cambiato l'indirizzo IP per il post.)

Quando provo a eseguire questo utilizzando un certificato PKCS # 12 (un file .pfx), Torno a quello che sembra essere un errore openSSL. Ecco l'intera traceback errore:

 
    File "Usinghttplib_Test.py", line 175, in 
    t.connect(cert_file=opts["-keys"], host=host_name, usrname=opts["-username"], passwd=opts["-password"]) 
    File "Usinghttplib_Test.py", line 40, in connect 
    self.conn.endheaders() 
    File "c:\python26\lib\httplib.py", line 904, in endheaders 
    self._send_output() 
    File "c:\python26\lib\httplib.py", line 776, in _send_output 
    self.send(msg) 
    File "c:\python26\lib\httplib.py", line 735, in send 
    self.connect() 
    File "c:\python26\lib\httplib.py", line 1112, in connect 
    self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file) 
    File "c:\python26\lib\ssl.py", line 350, in wrap_socket 
    suppress_ragged_eofs=suppress_ragged_eofs) 
    File "c:\python26\lib\ssl.py", line 113, in __init__ 
    cert_reqs, ssl_version, ca_certs) ssl.SSLError: [Errno 336265225] _ssl.c:337: error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib 

Avviso, l'errore openSSL (l'ultima voce della lista) nota "PEM lib", che ho trovato strano, dal momento che non sto cercando di utilizzare un certificato PEM.

Per i calci, ho convertito il certificato PKCS # 12 in un certificato PEM e ho eseguito lo stesso codice utilizzando che. In tal caso, non ho ricevuto errori, mi è stato richiesto di inserire la pass phrase PEM e il codice ha tentato di raggiungere il server. (Ho ricevuto la risposta "Il servizio non è disponibile. Riprova più tardi.", Ma credo che sarebbe perché il server non accetta il certificato PEM. Non riesco a connettermi in Firefox al server usando il certificato PEM entrambi.)

httplib's HTTPSConnection suppone supportare i certificati PCKS # 12? (Ovvero, file pfx.) Se è così, perché sembra che openSSL stia cercando di caricarlo all'interno della lib di PEM? Sto sbagliando tutto questo?

Qualsiasi consiglio è benvenuto.

MODIFICA: il file del certificato contiene sia il certificato sia la chiave privata, motivo per cui sto fornendo lo stesso nome file per i parametri key_file e cert_file di HTTPSConnection.

risposta

4

Nella mailing list openSS, ho chattato con Mounir Idrassi. Ha notato che openSSL supporta i file PKCS # 12 e, in base al messaggio di errore che sto ricevendo, sembra che httplib stia chiamando la funzione sbagliata per caricare la chiave.

Nelle sue parole:.

"Per quanto riguarda l'errore che si stanno ottenendo, sembra che il modulo phython in uso sta chiamando SSL_CTX_use_PrivateKey_file dandogli PKCS # 12 nome del file Questo non fa perché SSL_CTX_use_PrivateKey_file accetta solo due formati: SSL_FILETYPE_PEM e SSL_FILETYPE_ASN1. "

(sto dando httplib il nome del file PKCS # 12 come file di chiave, perché questo formato di file include sia il CERT e la chiave privata nello stesso file.)

"Al fine di correggere questo, hanno due soluzioni: - O feed il modulo python con la chiave privata in un file PEM. - O modifica il codice sorgente di questo modulo python per usare le funzioni PKCS # 12 che ho citato sopra per estrarre la chiave privata come EVP_PKEY e quindi chiama SSL_use_PrivateKey anziché SSL_CTX_use_PrivateKey_file, insieme a SSL_use_certificate per l'impostazione del certificato associato."

(ho provato la prima e non era in grado di farlo funzionare non significa necessariamente che non funzionerà,. Solo che non ero in grado di.)

4

Questa non è una sorpresa . la documentazione di riferimento libreria di Python sono abbastanza chiari su questo Da http://docs.python.org/library/httplib.html:.

classe httplib HTTPSConnection (host [, port [, key_file [, cert_file [, rigorosa [, timeout [, source_address]]]. ]]])

Una sottoclasse di HTTPConnection che utilizza SSL per la comunicazione con server sicuri. La porta predefinita è 443. key_file è il nome di PEM formattato file che contiene la chiave privata. cert_file è un PEM formattato file della catena di certificati.

+0

+1 per RTFM. Dove eri l'anno scorso quando stavo lavorando a questo? :) –

+0

Ciao Remi, ero un po 'lento dal punto di vista ;-) - Sono abbastanza nuovo per SO. Ho appena trovato il tuo post cercando su una stringa di errore simile. Si scopre che ho appena smantellato l'ordine degli argomenti da qualche parte lungo la catena di chiamate e non ho mai passato il percorso chiave in httplib. – Blairo