2015-05-07 15 views
10

Sto cercando di utilizzare la connessione ad un'altra usando il modulo asyncio Python 3 e ottenere questo errore:Cosa significa "SSLError: [SSL] PEM lib (_ssl.c: 2532)" che significa usare la libreria ssl Python?

 36  sslcontext = ssl.SSLContext(ssl.PROTOCOL_TLSv1) 
---> 37  sslcontext.load_cert_chain(cert, keyfile=ca_cert) 
    38 

SSLError: [SSL] PEM lib (_ssl.c:2532) 

la questione è proprio quello che significa l'errore. Il mio certificato è corretto, il keyfile (certificato CA) potrebbe non.

+0

Si dice che la chiave -file potrebbe non essere corretta. Il caricamento del certificato fallirà se il certificato (chiave pubblica) non viene associato al file della chiave privata corretta. – Prabhu

+0

Hai 'keyfile = ca_cert', che probabilmente non è corretto (o hai scelto nomi di variabili orribili). Il tuo 'ca_cert' contiene davvero una chiave privata? – larsks

+0

@larsks In che modo la scelta di nomi di variabili orribili può causare errori nel codice? Qualche suggerimento (o convenzione) su come nominarli? Il file ca_cert inizia con '----- BEGIN CERTIFICATE -----', quella che sembra essere una chiave crittografata valida e termina con '----- CERTIFICATO DI FINE -----'. L'intestazione e il piè di pagina dovrebbero dire qualcosa di diverso? – sargas

risposta

14

Partendo dal presupposto che la versione 3.4 viene utilizzato:

See: https://github.com/python/cpython/blob/3.4/Modules/_ssl.c#L2529-L2535

PySSL_BEGIN_ALLOW_THREADS_S(pw_info.thread_state); 
r = SSL_CTX_check_private_key(self->ctx); 
PySSL_END_ALLOW_THREADS_S(pw_info.thread_state); 
if (r != 1) { 
    _setSSLError(NULL, 0, __FILE__, __LINE__); 
    goto error; 
} 

Quello che sta dicendo è che SSL_CTX_check_private_key fallito; quindi, la chiave privata non è corretta.

+0

concordato. Sei andato alla fonte e hai trovato la risposta giusta. –

+0

L'ho letto prima, ma non avevo idea di cosa significasse. Penso che stia usando _openssl_ (su sistemi Unix) e riportando l'errore che ha ottenuto a livello di sistema. Questo spiega perché l'errore genererebbe da quella linea nella sorgente, giusto? – sargas

8

Nel codice, si sta chiamando:

sslcontext.load_cert_chain(cert, keyfile=ca_cert) 

Dal documentation:

Load a private key and the corresponding certificate. The certfile string must be the path to a single file in PEM format containing the certificate as well as any number of CA certificates needed to establish the certificate’s authenticity. The keyfile string, if present, must point to a file containing the private key in. Otherwise the private key will be taken from certfile as well. See the discussion of Certificates for more information on how the certificate is stored in the certfile.

In base al nome degli argomenti nel tuo esempio, sembra che si sta passando un certificato CA all'argomento keyfile. Non è corretto, è necessario passare la chiave privata utilizzata per generare il certificato locale (altrimenti il ​​client non può utilizzare il certificato). Un file della chiave privata avrà un aspetto simile:

-----BEGIN RSA PRIVATE KEY----- 
Proc-Type: 4,ENCRYPTED 
DEK-Info: AES-128-CBC,9BA4973008F0A0B36FBE1426C198DD1B 

...data... 
-----END RSA PRIVATE KEY----- 

è necessario solo il certificato CA se si sta cercando di verificare la validità dei certificati SSL che sono stati firmati da questo certificato. In tal caso, probabilmente si utilizzerà SSLContext.load_verify_locations() per caricare il certificato CA (sebbene non abbia lavorato di recente con il modulo SSL, quindi non prendere la parola su quel punto).

Problemi correlati