【问题标题】:Is there a way to get remote peer certificate with certificate verification disabled (CERT_NONE) in Python?有没有办法在 Python 中获取禁用证书验证(CERT_NONE)的远程对等证书?
【发布时间】:2016-03-04 18:19:31
【问题描述】:

我正在使用 Python 3。我正在使用来自 ssl 库的 SSLContext

我想知道如何在CERT_NONE 模式下请求和获取远程对等证书(与SSLSocket.getpeercert() 一样)。目前,我得到一个空字典(根据文档,这是预期的)。那么,我可以在不挖掘私人内容的情况下做到这一点吗?

注意

不是试图重新实现加密。实际上,我不需要任何加密,但是我需要上下文(和一个套接字)和远程证书(再次,出于信息目的,不是为了验证或实际加密任何东西)。

【问题讨论】:

  • 我猜你说的是在服务器应用程序中获取客户端证书?
  • 没错!实际上,我在 TLS 套接字上运行了至少两个对客户端使用基于证书的身份验证的服务。我刚刚发现在过去的几天里,其中一个发生了一些非法连接尝试,我很好奇这可能是谁以及为什么。我就像“哎呀,让我们在 python 中快速做一些事情来检查一下”,但我遇到了这个问题...... -_-“而且似乎没有办法禁用证书检查或在 CERT_REQUIRE 或 CERT_NONE 中启用证书获取模式...

标签: python python-3.x ssl ssl-certificate


【解决方案1】:

我找到了一种不偏离默认ssl 库的方法(它的优点是存在):

socket.getpeercert(binary_form=True)

提供 DER 格式的证书,这对于我必须做的事情来说已经足够了。

Afaik,返回一个空字典是为了避免盲目相信人们以明文形式发送且未经验证的内容。

【讨论】:

    【解决方案2】:

    Python/OpenSSL 混合请求客户端证书证书并对其进行验证:

    • CERT_NONE(OpenSSL:SSL_VERIFY_NONE)根本不会向客户端请求证书。这意味着客户端不会发送证书。
    • CERT_REQUIRE(OpenSSL:SSL_VERFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT)和CERT_OPTIONAL(OpenSSL:SSL_VERIFY_PEER)将请求证书,但如果证书无法验证,也会失败。

    您需要的是要求证书,然后有办法自己处理验证并接受所有客户端证书。这可以通过自定义验证回调来完成。在 OpenSSL 中,这可以通过 SSL_CTX_set_verify 完成。但不幸的是,Python ssl library 似乎没有公开必要的接口来拥有自己的验证回调。但是应该可以使用pyOpenSSL,它可以让你set your own verification callback

    【讨论】:

      猜你喜欢
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-24
      • 2019-11-06
      • 2015-04-13
      相关资源
      最近更新 更多