Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 验证SSL/X.509证书是否由其他证书签名_Python_Ssl_Twisted_X509_Pyopenssl - Fatal编程技术网

Python 验证SSL/X.509证书是否由其他证书签名

Python 验证SSL/X.509证书是否由其他证书签名,python,ssl,twisted,x509,pyopenssl,Python,Ssl,Twisted,X509,Pyopenssl,问题 如何使用PyOpenSSL或Twisted验证X.509证书是否由另一个证书签名?我希望客户端验证收到的服务器证书是否是对其客户端证书进行签名的服务器证书 我浏览了PyOpenSSL文档,似乎找不到任何关于如何在建立SSL连接的过程中单独验证证书的内容 我在twisted.internet.\u sslverify:PublicKey.verifyCertificate()中找到了对OpenSSL.crypto:X509.verify()的引用,但是twisted方法被注释掉(在twist

问题

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

我浏览了PyOpenSSL文档,似乎找不到任何关于如何在建立SSL连接的过程中单独验证证书的内容

我在
twisted.internet.\u sslverify:PublicKey.verifyCertificate()
中找到了对
OpenSSL.crypto:X509.verify()的引用,但是twisted方法被注释掉(在twisted 13.0中),而X509方法不存在(在PyOpenSSL 0.13中)

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

用例

证书:

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

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

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

设置:

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

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

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

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

您应该能够使用以下内容: 基本上是:

  • 使用
    load\u certificate()
  • 创建
    X509Store()
    对象
  • 使用
    add_cert()
    在应用商店中添加您的中间证书
  • 创建一个
    X509StoreContext()
    对象,用存储对象和结束证书初始化它
  • 对存储上下文对象调用
    verify\u certificate()
  • 实际上,我无法做到这一点,我认为原因如下:


    简言之,即使在2016年,PyOpenSSL中似乎仍然没有正确的等待来检查证书,这是非常悲哀的。请注意,大家的共识似乎是,如果您在TLS连接内操作,则最好通过连接例程检查,而不是通过
    检查\u certificate()

    脱机检查。您确定不只是要正确设置受信任的CA根吗?我的目的是让特定的用户(使用客户端证书)连接到服务器(具有服务器证书)。但是客户端将验证他们是否连接到真正的服务器(客户端验证自己的证书是否由服务器证书签名),而不是只信任服务器是否由根CA签名。这样让客户端验证服务器的身份是否多余?还是真的不可能?或者有一种更简单的方法吗?它不是多余的,但与通常的方法相反。pyOpenSSL中有一些API,可以让您设置客户端,使其仅允许使用由某个(或多个)证书签名的证书连接到服务器。pyOpenSSL中没有API用于将成功连接限制为服务器证书是客户端证书签名者的连接。安排这项工作并非不可能,但首先需要扩展pyOpenSSL(或者想出一些创造性的替代方法来检查证书签名)。问我原始问题的另一种方法是:为什么不在客户端声明您希望对服务器证书进行签名的证书是唯一受信任的CA根,从而验证服务器证书?如果您担心“官方”CA根被破坏(或不可信),那么您仍然可以采取这种方法:只需确保服务器证书由您控制的证书(以及私钥)签名。我想我只需通过确保我只信任(单个但自签名)的标准方式验证服务器证书即可根CA。谢谢你的帮助。