如何在Facebook图形api上使用twisted.web.client.Agent时处理OpenSSL.SSL.Error?

ker*_*ter 4 python ssl twisted

我正在运行ff.来自Mac OS X(优胜美地)上的virtualenv的代码:

    # 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()
Run Code Online (Sandbox Code Playgroud)

我得到:

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

当我用卷毛打电话给uri时,我没有这个问题.

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

Gly*_*yph 7

您可能没有配置任何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/openssl/cert.pem在安装后看到这些证书颁发机构证书)

另一个是您可以从Certifi获取一些证书,然后设置(未记录的)环境变量,告诉OpenSSL查找它们,例如,export SSL_CERT_FILE="$(python -m certifi)"在调用Python程序之前,在shell中执行.

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