ssl.SSLError:python ssl库中的[SSL] PEM库(_ssl.c:3833)

时间:2019-09-24 09:22:34

标签: python ssl azure-iot-hub

所以我正在与我的IoT中心一起验证X509证书,以便从应用程序发送/接收消息。但是,它总是抛出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

1 个答案:

答案 0 :(得分:1)

这意味着SSL_CTX_use_certificate_chain_filewhich is a part of OpenSSL)返回了错误代码,并且两种典型情况均未描述这种情况,因此Python的代码无法告诉您更多有关此情况的信息。

因此,唯一的线索是检查该函数接收的内容确切,并阅读其文档(如果还不够,还需要提供源代码)以试图找出其失败原因。如果这还不够,那么您必须在C调试器下运行该进程以在体内进行相同的检查。


我的(盲目的)猜测是证书文件的格式/密码不正确/不受支持,或者不包含the correct certificate chain as required by the TLS standard。具体来说,documentation说:

  

SSL_CTX_use_certificate_chain_file()从以下位置加载证书链   filectx中。证书必须为PEM格式,并且必须为   从主题的证书开始排序(实际客户或   服务器证书),然后是中间CA证书(如果有)   适用,并以最高级别(根)CA结束。