Braintree SDK SSLCertificateError на локальном сервере разработчиков AppEngine

Использование Braintree SDK под моим местным dev_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'))

Я также попробовал взломать в main.py проекта https://github.com/agfor/braintree-python-appengine, но я получаю то же сообщение об ошибке SSL.

Моя среда разработки:

  • MacOSX 10.11.6
  • Расширения Python для gcloud 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 ответ

Решение

Поддержка 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'

Решение состоит в том, чтобы обновить мою версию python через brew:

$ brew install python
$ python2 --version
Python 2.7.14

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

Затем, запуск моего dev-сервера с использованием недавно установленного python решает SSLCertificateError:

python2 $appserver_path/dev_appserver.py ...
Другие вопросы по тегам