AppEngine本地开发服务器上的Braintree SDK SSLCertificateError

时间:2017-11-20 09:48:49

标签: python google-app-engine braintree braintree-sandbox

dev_appserver.pybraintree.ClientToken.generate()下使用Braintree SDK正在返回错误{<1}}:

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项目的main.py中尝试了黑客攻击,但我收到了相同的SSL错误消息。

我的开发环境:

  • MacOSX 10.11.6
  • gcloud app Python Extensions 1.9.63
  • Python 2.7.10
  • 请求== 2.18.4
  • 布伦特里== 3.39.0
  • 烧瓶== 0.12.2

注意:

  1. 部署到Google App Engine后,我可以毫无问题地获取客户端令牌
  2. requests上直接使用https://www.braintreepayments.com/会返回200而不会出现任何错误

1 个答案:

答案 0 :(得分: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启动我的dev服务器解决了SSLCertificateError

python2 $appserver_path/dev_appserver.py ...