ssl.SSLError: [SSL] PEM lib (_ssl.c:3833) in python ssl library

ssl.SSLError: [SSL] PEM lib (_ssl.c:3833) in python ssl library

所以我正在验证 X509 证书到我的 IoT 中心,以便 send/receive 来自我的应用程序的消息。但是它一直抛出 ssl.SSLError: [SSL] PEM lib (_ssl.c:3833) 错误。

我有正确的证书、私钥和密码。所以我转到 python github 查看错误的含义,_ssl.c 文件中的第 3833 行表示

r = SSL_CTX_use_certificate_chain_file(self->ctx,
        PyBytes_AS_STRING(certfile_bytes));
    PySSL_END_ALLOW_THREADS_S(pw_info.thread_state);
    if (r != 1) {
        if (pw_info.error) {
            ERR_clear_error();
            /* the password callback has already set the error information */
        }
        else if (errno != 0) {
            ERR_clear_error();
            PyErr_SetFromErrno(PyExc_OSError);
        }
        else {
            _setSSLError(NULL, 0, __FILE__, __LINE__); <--- THIS IS LINE 3833
        }
        goto error;
    }

这是否意味着我的证书有误?我的证书目前是像 C:/Certificate/MyCertName.pfx 这样的位置 感谢您的阅读,我们将不胜感激!

python 3.7.4 中 _ssl.c 的来源:https://github.com/python/cpython/blob/v3.7.4/Modules/_ssl.c

这意味着SSL_CTX_use_certificate_chain_filewhich is a part of OpenSSL)返回了一个错误代码,两个典型案例都没有描述这种情况,所以Python的代码无法告诉你更多相关信息.

所以唯一的方法是检查该函数到底接收了什么并阅读其文档(如果还不够,还阅读源代码)以找出它失败的原因。如果这还不够,您将不得不 运行 C 调试器下的过程以在体内检查相同的过程。


我(盲目)猜测证书文件可能是 incorrect/unsupported format/cipher,或者不包含 . Specifically, the documentation 说:

SSL_CTX_use_certificate_chain_file() loads a certificate chain from file into ctx. The certificates must be in PEM format and must be sorted starting with the subject's certificate (actual client or server certificate), followed by intermediate CA certificates if applicable, and ending at the highest level (root) CA.