2

问题

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

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

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

pyOpenSSL 不支持验证证书描述了一个无法手动验证证书链的错误,但我不完全确定这是否是我想要做的。

用例

证书:

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

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

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

设置:

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

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

这一切都很好(双方相互验证),但我想执行一个额外的步骤:

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

1 回答 1

0

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

  1. 在 PyOpenSSL 中加载您的证书load_certificate()
  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()

于 2017-10-12T15:12:40.620 回答