【问题标题】:Python requests library - get SSL certificate informationPython 请求库 - 获取 SSL 证书信息
【发布时间】:2014-06-16 23:54:03
【问题描述】:

我正在寻找一种方法来获取有关远程站点使用请求的 SSL 证书的信息(CA 和 CN 就足够了)。

当我使用例如 socket + OpenSSL 时,我可以很容易地得到那些,但是在我的代码中我使用了一个特殊的解析器 (Python 'requests' library - define specific DNS?),所以我需要使用 Requests 或 urllib2 - 到目前为止,我检查了大部分请求代码通过检查模块,我看不到获得这些值的方法。

在这一点上我很感激任何提示,也许我遗漏了一些明显的东西:)

[编辑]:

更准确地说 - 我正在修补请求库的一部分(从 'socket' 到 urllib2),以使用自定义名称解析器 - 它归结为:

self.my_opener = urllib2.build_opener(MyHTTPHandler,MyHTTPSHandler) (urllib2.OpenerDirector 实例)

my_opener.open(url) 返回一个 urllib.addinfourl 对象 - 如果可能的话,我需要从中提取证书信息。

很遗憾,在此问题被标记为重复问题之后,情况并非如此。

【问题讨论】:

标签: python ssl python-requests


【解决方案1】:

【讨论】:

  • 根据请求标准,证书将始终无效(它们是自签名的,即时生成的)。我只需要证书中的 CA / CN 来检查其他方法是否在接收端正确更改了它 - 仅此而已。
  • Monkey 补丁请求使用您的 ssl_match_hostname 版本。顺便说一句,证书验证有两个步骤。顺便说一句,证书验证有 2 个步骤 - 1 确保服务器拥有它发送的证书的私钥(verify=True 关键字,确实发生在 C 级别,在 ssl 扩展和 openssl 中)并检查此 url/主机名是否允许对于此证书(ssl_match_hostname)。你只需要调整后者。
【解决方案2】:

找到了。

例子:

f=my_opener.open(url)
f.fp._sock.fp._sock._sslobj # here's the ssl object holding the 'issuer' (CA) and 'server' (CN) attributes.

当你使用这个问题的补丁时这是有效的:Python 'requests' library - define specific DNS?

这个案例是如此奇特,我希望没有其他人永远不得不使用它。但是,如果您使用请求、在自定义名称解析器之间切换并且必须检查 SSL 证书 CA/CN,我希望这会有所帮助:)

【讨论】:

    猜你喜欢
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 2015-04-27
    • 2019-02-10
    • 2018-07-07
    相关资源
    最近更新 更多