问题
如何使用 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/ 这基本上是:
- 使用
load_certificate()
在 PyOpenSSL 中加载您的证书 - 创建一个
X509Store()
对象 - 使用
add_cert()
在商店中添加您的中间证书 - 创建一个
X509StoreContext()
对象,使用您的存储对象和最终证书对其进行初始化 - 在您的商店上下文对象上调用
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/