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
self.default_policy = BrowserLikePolicyForHTTPS()
def creatorForNetloc(self, hostname, port):
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):
treq = HTTPClient(Agent(reactor, contextFactory=WhitelistContextFactory([b'example.net'])))
response = yield treq.get('https://example.net/version')
content = yield response.content()
print(content)
WhitelistContextFactory
接受一个URLs列表(用bytes
表示),并检查hostname
是否在列表中以忽略TLS验证。您还可以使用正则表达式等高级技术。感谢https://github.com/twisted/treq/issues/213
不要这样做!
我最近几天也一直尝试着去做这件事。为了规避证书验证所付出的努力,我本可以更容易地创建一对密钥并继续我的工作:D。我在treq
问题列表中发现了这个评论,通过代码修改解决了这个问题:
from twisted.internet import _sslverify
_sslverify.platformTrust = lambda : None
我相信有一种复杂的方法可以“正确”地完成它,但在我看来,这不值得努力。我做了一个补丁,这样它就不会覆盖
platformTrust()
,我会尝试将其合并,但我不会过分乐观。从我看到的一些与信任根、ssl和证书有关的错误评论的语气来看,我不认为它会被合并。希望这可以帮到您。
twisted.web.client import Agent
。我猜测代码_sslverify.platformTrust = lambda : None
特别是覆盖了 platformTrust 以不执行任何操作。你知道吗,这适用于代理吗?如果使用代理,是否还有其他需要更改的内容? - mayk93