python - 验证 SSL/X.509 证书是否由另一个证书签名

标签 python ssl twisted x509 pyopenssl

问题

如何使用 PyOpenSSL 或 Twisted 验证 X.509 证书是否由另一个证书签名?我希望客户端验证收到的服务器证书是签署其客户端证书的证书。

我查看了 PyOpenSSL 文档,但似乎找不到任何关于如何与建立 SSL 连接分开验证证书的内容。

我在 twisted.internet._sslverify:PublicKey.verifyCertificate() 中找到了对 OpenSSL.crypto:X509.verify() 的引用,但是扭曲的方法被注释了out(在 Twisted 13.0 中)并且 X509 方法不存在(在 PyOpenSSL 0.13 中)。

pyOpenSSL has no support for verifying a certificate描述了一个无法手动验证证书链的错误,但我不完全确定这是否是我正在尝试做的。

用例

证书:

  • 使用 openssl 生成自签名 CA 证书。

  • 生成由 CA 证书签名的服务器证书。

  • 生成由服务器证书签名的客户端证书。

设置:

  • 服务器正在使用 Twisted 的 CertificateOptions及其服务器证书。 CA 证书是用于设置链的 CA 和服务器证书,其中服务器证书验证收到的客户端证书,CA 证书验证服务器证书(所有内置功能)。

  • 客户端还使用 CertificateOptions 作为客户端证书。 CA 证书仅包含 CA 证书。

一切正常(双方相互验证)但我想执行额外的步骤:

  • 在客户端set_verify()回调,验证客户端证书是否由服务器证书签名。

最佳答案

你应该可以用这里写的这样的东西来做到这一点: http://www.yothenberg.com/validate-x509-certificate-in-python/ 这基本上是:

  1. 使用 load_certificate() 在 PyOpenSSL 中加载您的证书
  2. 创建一个 X509Store() 对象
  3. 使用 add_cert() 在商店中添加您的中间证书
  4. 创建一个 X509StoreContext() 对象,使用您的存储对象和最终证书对其进行初始化
  5. 在您的商店上下文对象上调用 verify_certificate()

在实践中,我无法制作那部分,我认为这是由于此处解释的原因:https://mail.python.org/pipermail/cryptography-dev/2016-August/000676.html

简而言之,即使在2016年,PyOpenSSL中似乎仍然没有正确等待检查证书,这是非常可悲的。请注意,共识似乎是,如果您在 TLS 连接内操作,则连接例程会更好地检查事物,而不是通过 check_certificate()

离线检查

关于python - 验证 SSL/X.509 证书是否由另一个证书签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18701737/

相关文章:

php - 连接到 sandbox.2checkout.com :443 时出现未知 SSL 协议(protocol)错误

python - 使用 Twisted 的守护进程 python 项目

Python3 - 我在这里做错了什么?

python - 如何从值列表中的样本中获取排名?

ssl - 为什么浏览器有 3 级 SSL 证书?

c# - 没有 SSL - 证书的 C# 和 PHP 之间的加密通信?

python - Python Twisted 中的内存泄漏 : where is it?

python - 如何在扭曲服务器内与 redis 或 memcache 建立持久连接

python - 将时间段字符串转换为值/单位对

python - 使用python3.6和BeautifulSoup。我得到了 href,但无法下载它们