Python的treq在Windows上由于信任存储为空而导致Twisted/OpenSSL错误失败

3
当我在http://www.google.com上运行以下示例代码时,它可以正常工作。但是当我尝试在https://www.google.com上运行时,我会收到以下错误信息:
Requesting https://www.google.com

Unhandled error in Deferred:
Unhandled Error
Traceback (most recent call last):
Failure: twisted.web._newclient.ResponseNeverReceived: [<twisted.python.failure.Failure <class 'OpenSSL.SSL.Error'>>]

我正在使用Python 2.7.8、Twisted 14.0.2、Service_identity 14.0.0、Treq 0.2.1和OpenSSL 0.14。

import treq
from twisted.internet import reactor, defer
import sys

@defer.inlineCallbacks
def doit(url):
    print "Requesting "+ url + "\n"
    results = yield treq.get(url)
    print "...got results\n"
    content = yield results.content()
    print "%s"%content
    reactor.stop()

def main():
    url = sys.argv[1]
    reactor.callLater(0, doit, url)
    reactor.run()

if __name__ == '__main__':
    main()

提前感谢您!


什么操作系统?使用哪个Python版本?(例如:python.org、系统自带的Python、Homebrew或者Conda) - Glyph
$ python --version Python 2.7.8 :: Continuum Analytics, Inc.$ uname -a CYGWIN_NT-6.1-WOW64 ST-01-D-007 1.7.33-2(0.280/5/3) 2014-11-13 15:45 i686 Cygwin - David Worenklein
Glyph的解决方法可行且对于Windows Twisted SSL客户端至关重要。为了帮助其他人找到这个解决方法,我在Twisted 16.3.0上遇到的确切错误是:[<twisted.python.failure.Failure OpenSSL.SSL.Error: [('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')]>] - jimhark
我在运行于virtualenv中的Python 2上,遇到了在macOS 10.13上的这个问题。 - jml
1个回答

8
这里可能的问题是您没有选择任何信任根,因此OpenSSL无法对连接进行身份验证。
您可以通过执行“pip install certifi”来获得一些格式化为OpenSSL可使用的信任根,然后将您的 “SSL_CERT_FILE” 环境变量设置为指向 “python -m certifi” 的输出。在Python中,您可以通过在脚本的开头(在导入任何OpenSSL绑定之前)使用“import certifi; os.environ ["SSL_CERT_FILE"] = certifi.where()”来完成这个步骤,并保留HTML标记。

1
由于我在回答中没有提到这一点,我应该指出我们确实认为这是Twisted中的一个bug,而我在这里发布的只是一个解决方法。你不应该只为了进行传输层安全协议连接而手动配置。具体来说,你可以参考https://twistedmatrix.com/trac/ticket/6371。 - Glyph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接