繁体   English   中英

禁用 SSL 证书检查 Twisted Agents

[英]Disable SSL certificate check Twisted Agents

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

谢谢!

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问题的treq问题板上发现了这个评论

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

我确信有一种“正确”的方法可以做到这一点,但在我看来这不值得付出努力。 我做了一个补丁,这样它就不会覆盖platformTrust() ,我会尝试合并它,但我不会屏住呼吸。 从我看到的一些关于信任根、ssl 和证书的错误评论的语气来看,我认为它们不会被合并。 希望这有帮助。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM