2016-08-14 4 views
3

Я пишу приложение app append, которое нужно получить страницу из Stripe.Как использовать TLS 1.2 с appengine/urlfetch из приложения Go AppEngine

В основном я использую these instructions, которые поставляются с официальным интерфейсом Stripe API. Однако, когда я запускаю это с dev_appserver.py, я получаю:

2016/08/14 12:03:15 Requesting POST api.stripe.com/v1/customers 
2016/08/14 12:03:18 Error encountered from Stripe: {"type":"invalid_request_error","message":"Stripe no longer supports API requests made with TLS 1.0. Please initiate HTTPS connections with TLS 1.2 or later. You can learn more about this at https://stripe.com/blog/upgrading-tls.","request_id":"req_90O6reF1Mwi9yZ","status":401} 

Я обнаружил, что Python AppEngine приложения можно указать библиотеку SSL для использования в моем app.yaml (см SSL support). Однако, если добавить libraries раздел в мой файл app.yaml, я получаю:

$ (go_appengine/dev_appserver.py app) 
Traceback (most recent call last): 
    File "go_appengine/dev_appserver.py", line 89, in <module> 
    _run_file(__file__, globals()) 
    File "go_appengine/dev_appserver.py", line 85, in _run_file 
    execfile(_PATHS.script_file(script_name), globals_) 
    File "/Users/kchodorow/gitroot/tt/go_appengine/google/appengine/tools/devappserver2/devappserver2.py", line 1040, in <module> 
    main() 
    File "/Users/kchodorow/gitroot/tt/go_appengine/google/appengine/tools/devappserver2/devappserver2.py", line 1033, in main 
    dev_server.start(options) 
    File "/Users/kchodorow/gitroot/tt/go_appengine/google/appengine/tools/devappserver2/devappserver2.py", line 758, in start 
    options.config_paths, options.app_id) 
    File "/Users/kchodorow/gitroot/tt/go_appengine/google/appengine/tools/devappserver2/application_configuration.py", line 831, in __init__ 
    module_configuration = ModuleConfiguration(config_path, app_id) 
    File "/Users/kchodorow/gitroot/tt/go_appengine/google/appengine/tools/devappserver2/application_configuration.py", line 127, in __init__ 
    self._config_path) 
    File "/Users/kchodorow/gitroot/tt/go_appengine/google/appengine/tools/devappserver2/application_configuration.py", line 424, in _parse_configuration 
    config, files = appinfo_includes.ParseAndReturnIncludePaths(f) 
    File "/Users/kchodorow/gitroot/tt/go_appengine/google/appengine/api/appinfo_includes.py", line 82, in ParseAndReturnIncludePaths 
    appyaml = appinfo.LoadSingleAppInfo(appinfo_file) 
    File "/Users/kchodorow/gitroot/tt/go_appengine/google/appengine/api/appinfo.py", line 2191, in LoadSingleAppInfo 
    listener.Parse(app_info) 
    File "/Users/kchodorow/gitroot/tt/go_appengine/google/appengine/api/yaml_listener.py", line 227, in Parse 
    self._HandleEvents(self._GenerateEventParameters(stream, loader_class)) 
    File "/Users/kchodorow/gitroot/tt/go_appengine/google/appengine/api/yaml_listener.py", line 178, in _HandleEvents 
    raise yaml_errors.EventError(e, event_object) 
google.appengine.api.yaml_errors.EventError: libraries entries are only supported by the "python27" runtime 
    in "app/app.yaml", line 25, column 1 

который имеет смысл, потому что я не использую Python. Мне действительно нужен способ установить это для Go.

Мой app.yaml файл выглядит следующим образом:

application: app-name 
version: alpha-001 
runtime: go 
api_version: go1 

handlers: 
... 

Изменение runtime к python27 избавляется от ошибок библиотеки, но, очевидно, тогда мой идти код не работает.

Любые идеи о том, как включить TLS 1.2, как с сервером приложений, так и с производством?

+0

Вы не можете создать транспорт на appengine? Подобно 'tr: = & http.Transport {TLSClientConfig: & tls.Config {...}, } client: = & http.Client {Transport: tr}' возможно, в среде flex? – Sridhar

+0

К сожалению, AppEngine требует, чтобы вы использовали свой Transport, [urlfetch.Transport] (https://cloud.google.com/appengine/docs/go/urlfetch/reference#Transport) (AFAICT). Возможно, какой-то способ переопределить все, что делает этот транспорт [RoundTrip] (https://github.com/golang/appengine/blob/master/urlfetch/urlfetch.go#L169), что я и ищу. на. – kristina

+0

Я думаю, что это можно сделать в [flex environment] (https://cloud.google.com/appengine/docs/flexible/go/) - см. [Здесь] (https://godoc.org/google.golang .org/cloud/internal) – Sridhar

ответ

3

От Go сеть/HTTP документации:

Для контроля над прокси, TLS конф ция, держать-alives, сжатие и другие параметры, создайте Транспорт:

tr := &http.Transport{ 
    TLSClientConfig: &tls.Config{...}, 
    DisableCompression: true, 
} 
client := &http.Client{Transport: tr} 

Из appengine documentation кажется вы можете использовать пакет/HTTP чистый, как обычно, с небольшими изменениями.

0

См. Это oracle blog post. Appengine работает JDK7 и поддерживает TLSv1.2 но протокол по умолчанию TLSv1

Так что сначала пытается установить соединение в v1 и если оно не поддержка попробовать другие протоколы v1.1, а затем v1.2

Как насколько я знаю, вы не можете передать {-Dhttps.protocols = TLSv1.2} в GAE, но вы можете установить его через код {System.setProperty ("https.protocols", "TLSv1.2");}

+0

Я не думаю, что смогу от Го. dev_appserver.py вызывает [python backend] (https://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/tools/devappserver2/api_server.py), поэтому мне интересно как установить это в Python/Go, а не в Java. – kristina

0

Необходимо создать и настроить новый транспорт с конфигурацией TLS и использовать службу AppEngine. Это можно сделать, заменив функцию набора по умолчанию на то, что определено в AppEngine SDK (с контекстом).

// NewClient sets up an HTTP/2 client for a certificate and context 
func NewClient(ctx context.Context) (*http.Client, error) { 
    config := &tls.Config{} 
    transport := &http.Transport{ 
     TLSClientConfig: config, 
     Dial: func(network, addr string) (net.Conn, error) { 
      // this uses the appengine service to create the actual client 
      return socket.Dial(ctx, network, addr) 
     }, 
    } 
    return &http.Client{Transport: transport}, nil 
}