PythonSSL库中的ssl.SSLError:[ssl]PEM lib(_ssl.c:3833)

PythonSSL库中的ssl.SSLError:[ssl]PEM lib(_ssl.c:3833),python,ssl,azure-iot-hub,Python,Ssl,Azure Iot Hub,因此,为了从我的应用程序发送/接收消息,我正在将X509证书验证到我的IoT中心。但是,它不断抛出ssl.SSLError:[ssl]PEM lib(_ssl.c:3833)错误 我有正确的证书、私钥和密码。所以我转到PythonGithub来检查错误的含义,以及_ssl.c文件中的第3833行的含义 r = SSL_CTX_use_certificate_chain_file(self->ctx, PyBytes_AS_STRING(certfile_bytes));

因此,为了从我的应用程序发送/接收消息,我正在将X509证书验证到我的IoT中心。但是,它不断抛出
ssl.SSLError:[ssl]PEM lib(_ssl.c:3833)
错误

我有正确的证书、私钥和密码。所以我转到PythonGithub来检查错误的含义,以及_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;
    }
r=SSL\u CTX\u使用\u证书\u链\u文件(self->CTX,
PyBytes_作为字符串(certfile_bytes));
PySSL_END_ALLOW_THREADS_S(pw_info.thread_state);
如果(r!=1){
如果(pw_信息错误){
ERR_clear_error();
/*密码回调已设置错误信息*/
}
else if(errno!=0){
ERR_clear_error();
PyErr_setfromerno(PyExc_OSError);
}
否则{

_setssError(NULL,0,_文件,_线_uuuuuu);这意味着
SSL\u CTX\u use\u certificate\u chain\u FILE
()返回了一个错误代码,两种典型情况都没有描述这种情况,因此Python的代码无法告诉您更多信息

因此,唯一的方法是检查函数接收和读取其文档的内容(如果还不够的话,还包括源代码),试图找出它失败的原因。如果这还不够,则必须在C调试器下运行该进程,以便在vivo中进行检查


我(盲目)猜测,证书文件的格式/密码可能不正确/不受支持,或者不包含。具体来说,证书文件说:

SSL\u CTX\u use\u certificate\u chain\u file()
文件
转换为
ctx
。证书必须采用PEM格式,并且必须 从受试者的证书开始排序(实际客户或 服务器证书),然后是中间CA证书(如果需要) 适用,并在最高级别(根)CA处结束


要获取与Python副本对应的源代码,您需要检查的不是分支的提示,而是与特定版本对应的标记/提交。
sys.version
有这些信息。@ivan_pozdeev Hi,感谢您指出这一点!我确实查错了文件,我的版本是v3.7.4,我已经更新了问题,谢谢!Hi抱歉回复晚了,因为我的证书是PFX格式的,我把它转换成PEM格式,一切都很好!谢谢你的帮助!!