Android grp c ошибка: сбой согласования TLS ALPN с протоколами: [grp c -exp, h2] - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь использовать grp c в Android приложении

Важной частью кода является следующее:

private val managedChannel: ManagedChannel = ManagedChannelBuilder
        .forTarget("misserverurl.com")
        .build()

build.gradle с версией и зависимостями :

minSdkVersion 19

implementation "io.grpc:grpc-okhttp:1.26.0"
implementation "io.grpc:grpc-protobuf:1.26.0"
implementation "io.grpc:grpc-stub:1.26.0"

Протос выглядит нормально, и приложение работает без TLS ( .usePlaintext () )

Но я получаю эту ошибку:

java.lang.RuntimeException: TLS ALPN negotiation failed with protocols: [grpc-exp, h2]

Там, где кажется, что есть проблема с SSL рукопожатием .

Странная часть в том, что сервер работает с использованием BloomRCP с использованием TLS.

Я пытался использовать разные minSdkVersions, также используя разные версии io.grp c. * Lib и создавая пустое хранилище только с файлами прото и базовым кодом c, чтобы запустить его, но ничего, и добавив .connectionSpe c () также с другим CipherSuite.

Используя Wireshark, я мог видеть, что отправляемая мной версия TLS - 1.2, которая является правильной и ожидаемой (возможно, она не использует HTTP2?)

Любой гость? Заранее спасибо!

---------------------------------------- ----------- Редактировать -------------------------------------- -------------

Посмотрите в lib я нашел этот метод: useTransportSecurity ()

/**
* Sets the negotiation type for the HTTP/2 connection to TLS (this is the default).
...
*/
@Override
public final OkHttpChannelBuilder useTransportSecurity() { ... }

Мы по умолчанию используется TLS с HTTP / 2, так что это не проблема ...

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Наконец-то это была проблема с бэкэндом. После этого: https://www.getambassador.io/reference/core/tls/#alpn_protocols alpn_protocol был установлен следующим образом:

alpn_protocol = h2[, grpc-epx]

Где это должно быть:

alpn_protocol = h2

С этим и этим конфигом на стороне клиента это сработало!

private val managedChannel: ManagedChannel = ManagedChannelBuilder
        .forTarget("misserverurl.com")
        .build()
0 голосов
/ 11 января 2020

HTTP / 2 согласовывается во время TLS с использованием ALPN. Клиент отправляет протоколы, которые он поддерживает (в данном случае grp c -exp и h2, он же http / 2). Затем сервер выбирает, какой протокол или нет. Если ни один из них не выбран, единственными вариантами являются выбор другого протокола, такого как HTTP / 1, или сбой.

gRP C требует HTTP / 2, поэтому сервер должен выбрать «h2» через ALPN. Ошибка в том, что этого не произошло. Ваш сервер должен поддерживать HTTP / 2. Если вы используете терминатор TLS или балансировщик нагрузки L7, вы должны настроить его для поддержки HTTP / 2.

...