【问题标题】:Adding timeout while fetching server certs via python通过 python 获取服务器证书时添加超时
【发布时间】:2014-10-29 13:39:25
【问题描述】:

我正在尝试获取服务器证书列表并使用 python 标准 SSL 库来完成此操作。我就是这样做的:

import ssl
from socket import *

urls = [i.strip().lower() for i in open("urls.txt")]
for urls in url:
    try:
        print ssl.get_server_certificate((url, 443))
    except error:
        print "No connection"

但是对于某些 URL,存在连接问题并且连接只是超时。但是它会在超时之前等待默认的 ssl 超时值(很长)。如何在 ssl.get_server_certificate 方法中指定超时?我之前已经为套接字指定了超时,但我不知道如何为这个方法做这件事

【问题讨论】:

    标签: python ssl ssl-certificate


    【解决方案1】:

    来自docs

    SSL sockets provide the following methods of Socket Objects:
    
    gettimeout(), settimeout(), setblocking()
    

    所以应该很简单:

    import ssl
    from socket import *
    
    settimeout(10)
    
    urls = [i.strip().lower() for i in open("urls.txt")]
    for urls in url:
        try:
            print ssl.get_server_certificate((url, 443))
        except (error, timeout) as err:
            print "No connection: {0}".format(err)
    

    【讨论】:

    • 得到以下错误: AttributeError: 'module' object has no attribute 'settimeout' 。我在文档中看到这是在 python 2.7.9 中引入的,我的版本是 2.7.3.Could是问题吗?
    • 而不是 ssl.settimeout 尝试使用套接字超时,只用 settimeout(10) 替换该行(应该已经从套接字导入)。
    • NameError: name 'settimeout' is not defined 是我得到的错误..但是..setdefaulttimeout(3) 方法有效..无论如何感谢您指出我正确的方向..
    • setdefaulttimeout(3) 需要没有 ssl.setdefaulttimeout(3),但是,ssl 模块仍然在 connect _ssl_wrap_socket_impl -> ssl.py init self.dohandshake 中挂起 1% 的时间() self._sslobj.dohandshake()。蟒蛇 2.7.18。使用 python 2.7.12 的不同机器不这样做,去看看。
    • setdefaulttimeout 似乎对我有用,编辑了答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    • 2014-09-16
    • 2018-02-14
    • 2011-03-17
    相关资源
    最近更新 更多