Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在gRPC上处理TLS_Android_Ssl_Tls1.2_Grpc_Grpc Java - Fatal编程技术网

Android 在gRPC上处理TLS

Android 在gRPC上处理TLS,android,ssl,tls1.2,grpc,grpc-java,Android,Ssl,Tls1.2,Grpc,Grpc Java,我正在连接到具有SSL证书的TLS支持的服务器。我在Android应用程序客户端上收到SSL握手错误。我还使用useTransportSecurity()处理TLS协商类型。是否有任何解决方法可以在不固定证书的情况下避免此错误 遇到错误: Caused by: java.lang.RuntimeException: protocol negotiation failed at io.grpc.okhttp.OkHttpProtocolNegotiator.negotiate(OkHtt

我正在连接到具有SSL证书的TLS支持的服务器。我在Android应用程序客户端上收到SSL握手错误。我还使用
useTransportSecurity()
处理TLS协商类型。是否有任何解决方法可以在不固定证书的情况下避免此错误

遇到错误:

Caused by: java.lang.RuntimeException: protocol negotiation failed

    at io.grpc.okhttp.OkHttpProtocolNegotiator.negotiate(OkHttpProtocolNegotiator.java:96)

    at io.grpc.okhttp.OkHttpProtocolNegotiator$AndroidNegotiator.negotiate(OkHttpProtocolNegotiator.java:147)

    at io.grpc.okhttp.OkHttpTlsUpgrader.upgrade(OkHttpTlsUpgrader.java:63)

    at io.grpc.okhttp.OkHttpClientTransport$2.run(OkHttpClientTransport.java:474)

    at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123)

    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) 

    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) 

    at java.lang.Thread.run(Thread.java:764) 
ManagedChannel mChannel = OkHttpChannelBuilder.forAddress(host, port)
        .useTransportSecurity()
        .build();

这就是我生成频道的方式:

Caused by: java.lang.RuntimeException: protocol negotiation failed

    at io.grpc.okhttp.OkHttpProtocolNegotiator.negotiate(OkHttpProtocolNegotiator.java:96)

    at io.grpc.okhttp.OkHttpProtocolNegotiator$AndroidNegotiator.negotiate(OkHttpProtocolNegotiator.java:147)

    at io.grpc.okhttp.OkHttpTlsUpgrader.upgrade(OkHttpTlsUpgrader.java:63)

    at io.grpc.okhttp.OkHttpClientTransport$2.run(OkHttpClientTransport.java:474)

    at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123)

    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) 

    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) 

    at java.lang.Thread.run(Thread.java:764) 
ManagedChannel mChannel = OkHttpChannelBuilder.forAddress(host, port)
        .useTransportSecurity()
        .build();



感谢您的时间和帮助。

这可能与您如何创建服务器有关;有关
相互TLS
,请参阅

Server server = NettyServerBuilder.forPort(8443)
    .sslContext(GrpcSslContexts.forServer(certChainFile, privateKeyFile)
    .trustManager(clientCAsFile)
    .clientAuth(ClientAuth.REQUIRE)
    .build());

ALPN在TLS握手期间失败,这会阻止gRPC协商HTTP/2。您没有连接到gRPC/HTTP/2服务器,或者客户端的TLS库太旧


请查看文档。也就是说,您可能希望在应用启动时将Play Services动态安全提供程序“安装”到运行时。

回答我自己的问题

此错误来自ALPN TLS扩展,我需要SSL端点来支持该扩展。我正在使用NPN,这就是我无法连接的原因


Carl Mastrangelo在grpc.io google groups上发布的

该端点需要ALPN TLS支持,而且工作起来很有魅力。然而,我仍然想知道为什么Android需要安装动态安全提供商。我尝试了一些新的和旧的安卓设备,我似乎没有遇到任何来自SECURITY.md的问题:“尽管ALPN主要在较新的安卓版本上工作(特别是自5.0以来),但存在一些bug和发现的安全漏洞,只有升级安全提供商才能修复。”有些bug与在应用程序的其他部分中完成的库调用竞争(比如在应用程序的其他地方使用NPN)。这类事情会“随机”触发。此外,旧设备可能使用NPN而不是ALPN。这可能在今天起作用,但需要在服务器上使用NPN。但NPN的支持正在生态系统中消失。