所以我正在与我的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
答案 0 :(得分:1)
这意味着SSL_CTX_use_certificate_chain_file
(which is a part of OpenSSL)返回了错误代码,并且两种典型情况均未描述这种情况,因此Python的代码无法告诉您更多有关此情况的信息。
因此,唯一的线索是检查该函数接收的内容确切,并阅读其文档(如果还不够,还需要提供源代码)以试图找出其失败原因。如果这还不够,那么您必须在C调试器下运行该进程以在体内进行相同的检查。
我的(盲目的)猜测是证书文件的格式/密码不正确/不受支持,或者不包含the correct certificate chain as required by the TLS standard。具体来说,documentation说:
SSL_CTX_use_certificate_chain_file()
从以下位置加载证书链file
到ctx
中。证书必须为PEM格式,并且必须为 从主题的证书开始排序(实际客户或 服务器证书),然后是中间CA证书(如果有) 适用,并以最高级别(根)CA结束。