4

在我的本地下使用Braintree SDKdev_appserver.py时返回以下错误braintree.ClientToken.generate()

SSLError: SSLCertificateError:
Invalid and/or missing SSL certificate for URL:  
https://api.sandbox.braintreegateway.com:443/merchants/<merchant_id>/client_token

requests_toolbelt在我的服务器启动时使用:

# Make requests work in GAE
import requests
from requests_toolbelt.adapters import appengine
appengine.monkeypatch()

明确排除 SSL 验证也不起作用(返回相同的错误消息):

appengine.monkeypatch(validate_certificate=False)

事实上,没有requests_toolbelt,我在调用时得到的错误.generate()是:

ProtocolError('Connection aborted.', error(13, 'Permission denied'))

我还尝试了 Braintree-python-appengine 项目中的 hack,main.py得到了相同的 SSL 错误消息。

我的开发环境:

  • macOS 10.11.6
  • gcloud 应用程序 Python 扩展 1.9.63
  • Python 2.7.10
  • 请求==2.18.4
  • 大脑树==3.39.0
  • 烧瓶==0.12.2

笔记:

  1. 部署到 Google App Engine 后,我可以毫无问题地取回客户端令牌
  2. 直接使用requestsonhttps://www.braintreepayments.com/返回 200 没有任何错误
4

1 回答 1

1

Braintree 支持回复了我的询问(2017-11-20):

您收到的错误通常与您的应用程序运行时使用的 SSL/TLS 协议有关;我们的沙盒环境需要通过 TLS 1.2 建立连接,这一要求还不适用于生产。

从审查来看,在本地部署应用程序时使用的协议似乎对我们的环境无效。如果应用程序设置在 Google App Engine 中本地化,这可能是问题的原因;Python 使用系统提供的 OpenSSL,而 TLSv1.2 需要 OpenSSL 1.0.1c 或更高版本。

所以根本原因是我的 Python 版本使用了旧版本的 OpenSSL:

$ python --version
Python 2.7.10

$ python
>> import ssl
>> ssl.OPENSSL_VERSION
>> 'OpenSSL 0.9.8zh 14 Jan 2016'

解决方案是通过brew升级我的python版本:

$ brew install python
$ python2 --version
Python 2.7.14

$ python2
>> import ssl
>> ssl.OPENSSL_VERSION
>> 'OpenSSL 1.0.2m  2 Nov 2017'

然后,使用新安装的 python 启动我的开发服务器可以解决SSLCertificateError

python2 $appserver_path/dev_appserver.py ...
于 2017-11-20T12:40:05.413 回答