我正在连接到具有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();
感谢您的时间和帮助。
答案 0 :(得分:1)
ALPN在TLS握手期间失败,这阻止了gRPC协商HTTP / 2。您没有连接到gRPC / HTTP / 2服务器,或者您客户端的TLS库太旧了。
请查看SECURITY.md文档。也就是说,您可能希望在应用启动时将Play服务动态安全提供程序“安装”到运行时。
答案 1 :(得分:0)
创建服务器可能与问题无关;请参见SECURITY.md中的Mutual TLS
...
Server server = NettyServerBuilder.forPort(8443)
.sslContext(GrpcSslContexts.forServer(certChainFile, privateKeyFile)
.trustManager(clientCAsFile)
.clientAuth(ClientAuth.REQUIRE)
.build());
答案 2 :(得分:0)
回答我自己的问题。
此错误来自ALPN TLS扩展,我需要我的SSL端点来支持。我正在使用NPN,这就是为什么我无法连接的原因。
Carl Mastrangelo在grpc.io Google网上论坛中发布