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

2024-04-23 14:18:56 发布

您现在位置:Python中文网/ 问答频道 /正文

问题

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

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

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

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

用例

证书:

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

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

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

设置:

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

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

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

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

Tags: 方法文档服务器客户端ssl内容客户机twisted
1条回答
网友
1楼 · 发布于 2024-04-23 14:18:56

你应该可以这样做,写在这里: http://www.yothenberg.com/validate-x509-certificate-in-python/ 基本上是:

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

{我在这里解释的原因是我不能练习

总之,即使在2016年,PyOpenSSL中似乎仍然没有正确的等待来检查证书,这是非常可悲的。注意,大家一致认为,如果您在TLS连接内操作,那么最好通过连接例程检查,而不是通过check_certificate()离线检查

相关问题 更多 >