¿Qué significa “SSLError: PEM lib (_ssl.c: 2532)” mediante el uso de la biblioteca ssl de Python?

Estoy tratando de usar conectar a otra persona utilizando el módulo asyncio de Python 3 y obtengo este error:

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 pregunta es qué significa el error. Mi certificado es correcto, el archivo de claves (certificado de CA) podría no serlo .

Suponiendo que se está utilizando la versión 3.4:

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

Lo que está diciendo es que SSL_CTX_check_private_key falló; Por lo tanto, la clave privada no es correcta.

En su código, usted está llamando:

 sslcontext.load_cert_chain(cert, keyfile=ca_cert) 

De la documentación :

Cargar una clave privada y el certificado correspondiente. La cadena certfile debe ser la ruta a un solo archivo en formato PEM que contenga el certificado, así como cualquier número de certificados de CA necesarios para establecer la autenticidad del certificado. La cadena del archivo de claves, si está presente, debe apuntar a un archivo que contenga la clave privada. De lo contrario, la clave privada también se tomará de certfile. Consulte la discusión de Certificados para obtener más información sobre cómo se almacena el certificado en el archivo de certificados.

Según el nombre de los argumentos en su ejemplo, parece que está pasando un certificado de CA al argumento del keyfile . Eso es incorrecto, debe pasar la clave privada que se utilizó para generar su certificado local (de lo contrario, el cliente no puede usar su certificado). Un archivo de clave privada se verá algo así como:

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

Solo necesita el certificado de CA si está intentando verificar la validez de los certificados SSL que han sido firmados por este certificado. En ese caso, probablemente usaría SSLContext.load_verify_locations() para cargar el certificado de CA (aunque no he trabajado con el módulo SSL recientemente, así que no confíe en mi palabra al respecto).