禁用SSL证书检查Twisted Agents

时间:2016-09-26 13:59:49

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

我使用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

谢谢!

2 个答案:

答案 0 :(得分:5)

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获取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评论的基调来看,我认为它不会被合并。希望这会有所帮助。

答案 1 :(得分:0)

如果您想完全忽略对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())