【问题标题】:Disable SSL certificate check Twisted Agents禁用 SSL 证书检查 Twisted Agents
【发布时间】:2017-02-03 22:06:01
【问题描述】:

我正在使用 Twisted (16.3) 和 Treq (15.1) 在 Python (2.7) 中发出异步请求。

我在处理一些通过 HTTPS 的请求时遇到问题。

某些网站的证书无效,因此在向他们提出请求时,我得到了这个:

twisted.python.failure.Failure OpenSSL.SSL.Error

我希望我的客户信任任何服务器,包括那些没有证书或有自签名证书的服务器。

如何在我的客户端上禁用证书检查?

这是一个与我基本相同的问题:https://stackoverflow.com/questions/34357439/ssl-options-for-twisted-agents

谢谢!

【问题讨论】:

    标签: python ssl twisted twisted.web twisted.internet


    【解决方案1】:

    2019 年 2 月 7 日更新

    这是为treq创建域白名单的简单方法

    from treq.client import HTTPClient
    from twisted.web.iweb import IPolicyForHTTPS
    from twisted.web.client import BrowserLikePolicyForHTTPS, Agent
    from twisted.internet.ssl import CertificateOptions
    from twisted.internet import task, defer, ssl
    from zope.interface import implementer
    
    @implementer(IPolicyForHTTPS)
    class WhitelistContextFactory(object):
        def __init__(self, good_domains=None):
            """
            :param good_domains: List of domains. The URLs must be in bytes
            """
            if not good_domains:
                self.good_domains = []
            else:
                self.good_domains = good_domains
    
            # by default, handle requests like a browser would
            self.default_policy = BrowserLikePolicyForHTTPS()
    
        def creatorForNetloc(self, hostname, port):
            # check if the hostname is in the the whitelist, otherwise return the default policy
            if hostname in self.good_domains:
                return ssl.CertificateOptions(verify=False)
            return self.default_policy.creatorForNetloc(hostname, port)
    
    @task.react
    @defer.inlineCallbacks
    def main(reactor):
        # make a custom client, agent, and context factory
        # NOTE: WhitelistContextFactory() takes a list of BYTES
        treq = HTTPClient(Agent(reactor, contextFactory=WhitelistContextFactory([b'example.net'])))
        response = yield treq.get('https://example.net/version')
        content = yield response.content()
        print(content)
    

    WhitelistContextFactory 获取 URL 的 list(在 bytes 中)并检查 hostname 是否在列表中以忽略 TLS 验证。您也可以花哨并使用正则表达式。感谢https://github.com/twisted/treq/issues/213

    不要这样做!

    在过去的几天里,我也一直在尝试这样做。通过我为规避证书验证所做的所有努力,我可以轻松地创建一对密钥并继续我的快乐方式:D。我在 treq 问题板上找到了 this comment,该问题板猴子补丁:

    from twisted.internet import _sslverify
    _sslverify.platformTrust = lambda : None
    

    我确信有一种“正确”的复杂方法,但在我看来这不值得付出努力。我做了一个补丁,它不会覆盖platformTrust(),我会尝试将它合并,但我不会屏住呼吸。从我看到的一些与信任根、ssl 和证书有关的 bug cmets 的语气来看,我认为它不会被合并。希望这会有所帮助。

    【讨论】:

    • 嘿!感谢您的回答!我也遇到了该评论,但它对我没有帮助。我正在为我的请求使用代理,来自twisted.web.client import Agent。我猜代码,_sslverify.platformTrust = lambda : None 专门覆盖 platformTrust 以不做任何事情。你知道,这适用于代理吗?那么如果使用代理,还有什么需要改变的吗?
    • 这已经暗指我将近一天了。我无法相信 Python / Twisted 在处理生产/开发场景的证书验证方面有多糟糕——python 社区中的每个人都在使用真正的证书,还是用自己的 CA 污染他们的机器,或者只是不测试 SSL/TLS?
    • 我完全同意!有 Treq 开发人员正在开发“白名单”功能,该功能将允许选择的站点未经验证。希望它快点到来
    • 很高兴知道白名单功能即将推出。老实说,至少对于我的项目,我发现切换到python3.5 aiohttp要容易得多。在我看来,与 Twisted 相比,它以更优雅的方式提供异步请求,提供 SSL 证书处理和更简单的代理工作方式,仅举几例。当然,这涉及到一些重写,但从长远来看,这是值得的。
    • 诚实没有错 :) 仅供参考,龙卷风与扭曲也很好地结合在一起。您可以使用龙卷风的AsyncHTTPClient.fetch(),然后将事件循环与扭曲集成。 asyncio 集成也即将推出。这样你就不必重写太多代码了。
    【解决方案2】:

    如果您想完全忽略 SSL 的检查,这里有一个解决方法:

    from twisted.internet import ssl, _sslverify
    from twisted.web.iweb import IPolicyForHTTPS
    
    @implementer(IPolicyForHTTPS)
    class IgnoreHTTPS:
        def creatorForNetloc(self, hostname, port):
            options = ssl.CertificateOptions(verify=False)
            return _sslverify.ClientTLSOptions(hostname.decode('ascii'), options.getContext())
    

    【讨论】:

      猜你喜欢
      • 2016-10-07
      • 1970-01-01
      • 2014-06-23
      • 2013-11-12
      • 2019-06-14
      • 2011-07-19
      • 1970-01-01
      • 2018-11-11
      • 1970-01-01
      相关资源
      最近更新 更多