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

时间:2013-09-09 15:26:33

标签: python ssl twisted x509 pyopenssl

问题

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

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

我在OpenSSL.crypto:X509.verify()中找到了twisted.internet._sslverify:PublicKey.verifyCertificate()的引用,但是扭曲的方法被注释掉了(在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()回调中,验证客户端证书是否由服务器证书签名。

1 个答案:

答案 0 :(得分:0)

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

  1. 使用load_certificate()
  2. 在PyOpenSSL中加载证书
  3. 创建X509Store()对象
  4. 使用add_cert()在商店中添加中间证书
  5. 创建一个X509StoreContext()对象,使用您的商店对象和结束证书对其进行初始化
  6. 在商店上下文对象上调用verify_certificate()
  7. 在实践中,我无法做出那一部分,我认为这是出于这里解释的原因:https://mail.python.org/pipermail/cryptography-dev/2016-August/000676.html

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

    离线