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
Замечания:
- После развертывания в Google App Engine я без проблем получаю токен клиента
- Непосредственно использование
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 ...