不记录'证书与预期的主机名不匹配'错误消息

时间:2017-08-05 12:54:06

标签: python request ssl-certificate

我的网络应用会请求多个网址,有时会引发SSL证书错误。它们都是第三方网址,因此无法修复错误,我不想记录它们。然而,有些东西是自己记录的:2017-08-05 00:22:49,496 ERROR -- : Certificate did not match expected hostname: www.improving-autonomy.org. Certificate: {'subjectAltName': [('DNS', '*.wordpress.com'), ('DNS', 'wordpress.com')], 'subject': ((('commonName', u'*.wordpress.com'),),)}任何人都知道如何阻止它?请在下面找到我的代码。非常感谢提前!

try :
    ua = UserAgent()
    headers = {'Content-Type' : 'text/html', 'Accept-Encoding' : None, 'User-Agent' : ua.random}
    response = requests.get(url, headers=headers, timeout=10)
except ssl.CertificateError as e :
    pass

更新 - : 它看起来像请求模块记录它(connection.py)。如果我已经捕获了相同的异常,为什么它会继续记录?

def _match_hostname(cert, asserted_hostname):
    try:
        match_hostname(cert, asserted_hostname)
    except CertificateError as e:
        log.error(
            'Certificate did not match expected hostname: %s. '
            'Certificate: %s', asserted_hostname, cert
        )
    # Add cert to exception and reraise so client code can inspect
    # the cert when catching the exception, if they want to
    e._peer_cert = cert
    raise

2 个答案:

答案 0 :(得分:4)

不确定。你正在捕获相同的异常,但你没有看到的是 这种情况正在发生。让我们来看看这里发生的事情的片段:

except CertificateError as e:
    log.error(
        'Certificate did not match expected hostname: %s. '
        'Certificate: %s', asserted_hostname, cert
    )
# Add cert to exception and reraise so client code can inspect
# the cert when catching the exception, if they want to
e._peer_cert = cert
raise

因此,当首次引发异常时,该代码捕获CertificateError,然后它生成log.error,根据代码中的注释将cert分配为属性,然后调用到了raise

此空raise调用现在将重新提升最后发生的异常, CertificateError异常, >那就是你所追捕的。因此,该代码已经进行了日志调用,并且正在从该特定的 raise 调用中捕获异常。

答案 1 :(得分:0)

您可以捕获异常,然后打印它的类型:

except Exception as exc:
    print exc, exc.message, exc.__class__

然后在代码中使用此特定异常类型,这应该有效。您还可以在except语句后添加else子句,并将日志记录代码放在那里。仅当try块成功执行时才会执行此代码