2015-11-09 27 views
3

我正在运行ff。从在Mac OS X(优胜美地)一个的virtualenv代码:如何在Facebook图形API上使用twisted.web.client.Agent时处理OpenSSL.SSL.Error?

# testfb.py 
    from twisted.internet import reactor 
    from twisted.python import log 
    from twisted.web.client import Agent 

    GRAPH_API = "https://graph.facebook.com/v2.5" 

    def stop(_): 
     reactor.stop() 

    def get_me(access_token): 
     agent = Agent(reactor) 
     uri = "{}/me?access_token={}".format(GRAPH_API, access_token) 
     log.msg("uri:" + uri) 
     return agent.request("GET", uri) 

    if __name__ == "__main__": 
     import sys 
     access_token = sys.argv[1] 
     d = get_me(access_token) 
     d.addErrback(log.err) 
     d.addCallback(stop) 
     reactor.run() 

我也得到:

Failure: twisted.web._newclient.ResponseNeverReceived: [<twisted.python.failure.Failure OpenSSL.SSL.Error: [('SSL routines', 'SSL3_GET_SERVER_CERTIFICATE', 'certificate verify failed')]>] 

当我打电话的URI的卷曲我没有这个问题。

顺便说一句,我还在virtualenv上使用pip安装了service_identity。

回答

3

您可能没有配置任何OpenSSL信任根。这是因为意外自动发生的,因为Cryptography与OS X的内置版本的OpenSSL链接;由于该版本的头文件已在El Capitan中删除,因此Cryptography现在将自己的内置版本的pyOpenSSL发布到轮子上。

这是Twisted中的一个错误,我们知道它;你可以在这里阅读更多关于它的信息:https://twistedmatrix.com/trac/ticket/6372。它已经开放了一段时间;因为它长期以来一直是偶然发生的,所以它一直没有成为重中之重。由于像你这样的人的错误报告,这是改变...

在此期间,虽然,你有两种可能的选择。

一个是,您可以从Homebrew安装OpenSSL,它将自动将一些证书颁发机构证书放入Cryptography的OpenSSL已在寻找它们的默认位置,其中brew install openssl。 (您可以在安装后看到/usr/local/etc/etc/openssl/cert.pem这些证书颁发机构的证书。)

另一个原因是,你可以从Certifi获得一些证书,然后设置(undocumented)环境变量,它告诉OpenSSL的找他们,这样做,例如,在调用你的Python程序之前,在shell中使用export SSL_CERT_FILE="$(python -m certifi)"

对不起,我希望这能回答你的问题!

+0

我正在使用macports,我尝试了几次重新安装openssl和py27-pyopenssl,但没有运气。 'certifi',OTOH,为我工作。谢谢! – kerrigangster

+0

我说“自制”,而不是“macports”的目的:)。证书颁发机构提取代码特定于自制软件,而不是与OpenSSL相关的。 https://github.com/Homebrew/homebrew/blob/master/Library/Formula/openssl.rb#L113这就是为什么我列出certifi作为替代选项:)。 – Glyph

+0

很高兴我可以帮忙,但! – Glyph