Car*_*arl 4 python ssl http twisted
我试图建立一个t.w.c.BrowserLikePolicyForHTTPS以作为使用ContextFactory了t.w.c.Agent.我正在为我希望代理与之通信的所有服务器使用内部CA,因此我希望能够告诉您加载CA证书(PEM格式)并将其用作trustRoot参数BrowserLikePolicyForHTTPS.我已阅读文档并查看了源代码,但我不知道我应该提供什么作为参数.我尝试提供PyOPenSSL x509对象,但是我收到一个错误:
exceptions.TypeError: ('Could not adapt', <OpenSSL.crypto.X509 object at 0x280b290>, <InterfaceClass twisted.internet._sslverify.IOpenSSLTrustRoot>)
Run Code Online (Sandbox Code Playgroud)
我可以在代码中t.i._sslverify看到OpenSSLCertificateAuthorities以某种方式适应IOpenSSLTrustRoot,但我不清楚这是如何发生的.
我知道股票代理不做任何证书检查.我正在使用treq的分支,我正在尝试添加一个选项来提供自定义代理.
任何有关trustRoot参数的帮助将不胜感激.如果我正在努力解决这个问题,请告诉我.
您的问题突出了文档中的可怕疏忽; 在API文档和叙述文档中都有.如果Jean-Paul无法找到"正确的方法"来做到这一点,那么普通用户显然没有希望. 我已经提交了一个错误来纠正这种疏忽.
同时,请避免让 - 保罗的解决方案.虽然它是功能性的,但它涉及的技术在未来的版本中几乎肯定会在没有警告的情况下破坏(正如他清楚地指出的)幸运的是,有支持的方法来做到这一点.如果您有一个备用信任根,Certificate则可用作trustRoot参数的值.您可以像这样使用它(我已经使用Twisted 14.0.2测试了以下示例):
from __future__ import print_function
from twisted.web.client import Agent, BrowserLikePolicyForHTTPS
from twisted.internet.task import react
from twisted.internet.ssl import Certificate
from twisted.internet.protocol import Protocol
from twisted.python.filepath import FilePath
from twisted.internet.defer import inlineCallbacks, Deferred
@inlineCallbacks
def main(reactor):
customPolicy = BrowserLikePolicyForHTTPS(
Certificate.loadPEM(FilePath("your-trust-root.pem").getContent())
)
agent = Agent(reactor, customPolicy)
response = yield agent.request(
"GET", "https://your-web-site.example.com/"
)
done = Deferred()
class CaptureString(Protocol):
def dataReceived(self, data):
print("Received:", data)
def connectionLost(self, reason):
done.callback(None)
response.deliverBody(CaptureString())
yield done
react(main)
Run Code Online (Sandbox Code Playgroud)