【问题标题】:ssl.SSLError: [SSL] PEM lib (_ssl.c:3833) in python ssl libraryssl.SSLError: [SSL] PEM 库 (_ssl.c:3833) 在 python ssl 库中
【发布时间】:2020-01-24 09:16:03
【问题描述】:

所以我正在向我的 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

【问题讨论】:

  • 要获取与您的 Python 副本相对应的源代码,您需要检查的不是分支的尖端,而是与您的特定版本相对应的标签/提交。 sys.version 有这个信息。
  • @ivan_pozdeev 您好,感谢您指出这一点!我确实查看了错误的文件,我的版本是 v3.7.4,我已经更新了问题,谢谢!

标签: python ssl azure-iot-hub


【解决方案1】:

这意味着SSL_CTX_use_certificate_chain_file (which is a part of OpenSSL) 返回了一个错误码,两种典型情况都没有描述这种情况,所以Python的代码无法告诉你更多。

因此,唯一的方法是检查该函数接收的确切内容并阅读其文档(如果这还不够,请阅读源代码)以试图找出它失败的原因。如果这还不够,您必须在 C 调试器下运行该进程才能在 vivo 中进行检查。


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

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

【讨论】:

  • 您好,很抱歉回复晚了,因为我的证书是 PFX 格式,我将它转换为 PEM 格式,一切都像魅力一样!谢谢你的帮助!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
  • 2018-03-15
  • 2020-01-14
  • 2018-07-29
  • 2017-06-01
相关资源
最近更新 更多