“SSLError: \[SSL\] PEM lib (_ssl.c:2532)”是什么意思使用 Python ssl 库?

新手上路,请多包涵

我正在尝试使用 Python 3 asyncio 模块连接到另一方并收到此错误:

      36     sslcontext = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
---> 37     sslcontext.load_cert_chain(cert, keyfile=ca_cert)
     38

SSLError: [SSL] PEM lib (_ssl.c:2532)

问题只是错误的含义。我的证书是正确 的,密钥文件(CA 证书)可能不 正确。

原文由 sargas 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

假设正在使用 3.6 版:

请参阅: https ://github.com/python/cpython/blob/3.6/Modules/_ssl.c#L3523-L3534

  PySSL_BEGIN_ALLOW_THREADS_S(pw_info.thread_state);
 r = SSL_CTX_check_private_key(self->ctx);
 PySSL_END_ALLOW_THREADS_S(pw_info.thread_state);
 if (r != 1) {
    _setSSLError(NULL, 0, __FILE__, __LINE__);
    goto error;
 }

它说的是 SSL_CTX_check_private_key 失败了;因此,私钥不正确。

参考可能的版本:

原文由 jmunsch 发布,翻译遵循 CC BY-SA 4.0 许可协议

在您的代码中,您正在调用:

 sslcontext.load_cert_chain(cert, keyfile=ca_cert)

文档 中:

加载私钥和相应的证书。 certfile 字符串必须是 PEM 格式的单个文件的路径,该文件包含证书以及建立证书真实性所需的任意数量的 CA 证书。密钥文件字符串(如果存在)必须指向包含私钥的文件。否则私钥也将从 certfile 中获取。有关证书如何存储在证书文件中的更多信息,请参阅证书的讨论。

根据示例中的参数名称,您似乎正在将 CA 证书传递给 keyfile 参数。这是不正确的,您需要传入用于生成本地证书的私钥(否则客户端无法使用您的证书)。私钥文件类似于:

 -----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,9BA4973008F0A0B36FBE1426C198DD1B

...data...
-----END RSA PRIVATE KEY-----

如果您尝试验证由该证书签署的 SSL 证书的有效性,则只需要 CA 证书。在那种情况下,您可能会使用 SSLContext.load_verify_locations() 加载 CA 证书(尽管我最近没有使用 SSL 模块,所以请不要相信我的话)。

原文由 larsks 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题