Question
如何使用 PyOpenSSL 或 Twisted 验证 X.509 证书是否由另一个证书签名?我希望客户端验证收到的服务器证书是否是签署其客户端证书的证书。
我浏览了 PyOpenSSL 文档,似乎找不到任何关于如何与建立 SSL 连接分开验证证书的信息。
我找到了参考OpenSSL.crypto:X509.verify()
in twisted.internet._sslverify:PublicKey.verifyCertificate()
,但是twisted方法被注释掉了(在Twisted 13.0中)并且X509方法不存在(在PyOpenSSL 0.13中)。
pyOpenSSL 不支持验证证书 https://bugs.launchpad.net/pyopenssl/+bug/892522描述了无法手动验证证书链的错误,但我不完全确定这是否是我想要做的。
Use Case
证书:
使用 openssl 生成自签名 CA 证书。
生成的服务器证书由 CA 证书签名。
生成的客户端证书由服务器证书签名。
Setup:
服务器正在使用 Twisted 的证书选项 http://twistedmatrix.com/documents/current/api/twisted.internet.ssl.CertificateOptions.html及其服务器证书。 CA 证书是 CA 和服务器证书,用于设置一个链,其中服务器证书验证收到的客户端证书,CA 证书验证服务器证书(所有内置功能)。
客户端还使用CertificateOptions作为客户端证书。 CA 证书仅包含 CA 证书。
这一切都很好(双方互相验证),但我想执行一个额外的步骤:
- 在客户端设置验证() http://pyopenssl.sourceforge.net/pyOpenSSL.html/openssl-context.html#l2h-141回调,验证客户端证书是否由服务器证书签名。
你应该能够用这里写的东西来做到这一点:http://www.yothenberg.com/validate-x509-certificate-in-python/ http://www.yothenberg.com/validate-x509-certificate-in-python/这基本上是:
- 在 PyOpenSSL 中加载您的证书
load_certificate()
- 创建一个
X509Store()
object
- use
add_cert()
在商店中添加您的中间证书
- 创建一个
X509StoreContext()
对象,使用您的商店对象和最终证书对其进行初始化
- call
verify_certificate()
在您的商店上下文对象上
在实践中,我无法完成该部分,我认为原因如下:https://mail.python.org/pipermail/cryptography-dev/2016-August/000676.html https://mail.python.org/pipermail/cryptography-dev/2016-August/000676.html
总之,即使到了 2016 年,PyOpenSSL 中似乎仍然没有正确的等待检查证书的情况,这是非常令人难过的。请注意,共识似乎是,如果您在 TLS 连接内进行操作,则最好通过连接例程进行检查,而不是通过离线进行检查check_certificate()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)