web-dev-qa-db-fra.com

Que signifie «SSLError: [SSL] PEM lib (_ssl.c: 2532)» signifie l'utilisation de la bibliothèque ssl Python ssl?

J'essaie d'utiliser la connexion à une autre partie en utilisant Python 3 module asyncio et obtenez cette erreur:

     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 question est juste de savoir ce que signifie l'erreur. Mon certificat est correct, le fichier de clés (certificat CA) peut ne pas l'être.

26
sargas

En supposant que la version 3.4 est utilisée:

Voir: 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;
 }

Ce qu'il dit, c'est que SSL_CTX_check_private_key échoué; par conséquent, la clé privée n'est pas correcte.

25
jmunsch

Dans votre code, vous appelez:

sslcontext.load_cert_chain(cert, keyfile=ca_cert)

De la documentation :

Chargez une clé privée et le certificat correspondant. La chaîne de certfile doit être le chemin d'accès à un fichier unique au format PEM contenant le certificat ainsi que le nombre de certificats CA requis pour établir l'authenticité du certificat. La chaîne de fichier de clés, si elle est présente, doit pointer vers un fichier contenant la clé privée. Sinon, la clé privée sera également extraite de certfile. Voir la discussion sur les certificats pour plus d'informations sur la façon dont le certificat est stocké dans le certfile.

En fonction du nom des arguments de votre exemple, il semble que vous passiez un certificat CA à l'argument keyfile. C'est incorrect, vous devez passer la clé privée qui a été utilisée pour générer votre certificat local (sinon le client ne peut pas utiliser votre certificat). Un fichier de clé privée ressemblera à quelque chose comme:

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

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

Vous n'avez besoin du certificat CA que si vous essayez de vérifier la validité des certificats SSL signés par ce certificat. Dans ce cas, vous utiliserez probablement SSLContext.load_verify_locations() pour charger le certificat CA (bien que je n'aie pas travaillé avec le module SSL récemment, alors ne prenez pas mon Word sur ce point).

15
larsks