【问题标题】:Manually verify certificates in Python3 ssl在 Python3 ssl 中手动验证证书
【发布时间】:2016-10-08 09:25:36
【问题描述】:

我正在开发 Python3 应用程序的客户端和服务器端。他们必须使用自签名证书通过 TLS 进行通信。

应该始终建立连接,即使双方从未见过对方,因此对方的证书也没有在其信任存储中。验证应在握手后使用自定义方法进行。

但是,Python 的 ssl library 在握手期间尝试验证证书,如果传入的证书未知且没有有效的证书链,则会失败。将verify_mode 设置为CERT_NONE 也不是一种选择,因为我的自定义验证方法确实需要双方的证书。

所以我的问题是:我如何要求对方提供证书但在握手期间关闭自动验证?或者也许我可以传递一个被调用的自定义验证器方法?

谢谢!

【问题讨论】:

  • 也许您应该考虑创建一个根自签名证书,将其添加到信任库中,然后用它签署客户端和服务器证书?
  • 有趣的想法,谢谢。那可能会奏效。而且由于握手后仍然会发生“真正的”验证,因此无需小心处理此自签名根证书,而是可以随软件一起提供。不过,这似乎不是一个非常优雅的解决方案。我还是宁愿简单地关闭自动验证尝试。
  • 感谢您的警告。我很清楚这一点,我确实计划验证端点身份。我只是想以自定义的方式来做。
  • 我也有同样的需求。我想使用 Python 来检查一些证书的到期日期。证书可能是自动签名的或由不受信任的机构签名,但我需要获取它以获取详细信息,以了解它何时到期。我在 shell 脚本中使用 curl 和 --verbose 选项完成了它,我想我会在几分钟内使用 requests 完成它,但它并不容易,即使直接使用 urllib3 或 socket ......

标签: python python-3.x ssl certificate


【解决方案1】:

您可以使用ssl.get_server_certificate((host,port))。它将以 PEM 格式返回证书。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-09
    • 2019-09-05
    • 2017-06-13
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 2014-09-24
    相关资源
    最近更新 更多