2016-05-12 20 views
1

In meinem Projekt mit grpc und java verwende ich OpenSSL, um eine sichere Verbindung zwischen Client und Server herzustellen.Verbindung zum Grpc-Server vom Client über SSL nicht möglich

Ich bin in der Lage, den Grpc-Server erfolgreich zu bringen.

Die Dokumentation here dass für einen sicheren Kanal der Client-Code erwähnt dies

ManagedChannel channel = ManagedChannelBuilder.forAddress("myservice.example.com", 443) 
    .build(); 
GreeterGrpc.GreeterStub stub = GreeterGrpc.newStub(channel); 

ist ich den Code auf Client verwenden wie folge aber die folgende Ausnahme ausgelöst wird.

mChannel = ManagedChannelBuilder.forAddress(GrpcConstants.LOCAL_GRPC_CLIENT_IP, GrpcConstants.LOCAL_GRPC_CLIENT_PORT).build(); 

    mEmployerServicesBlockingStub = EmployerServicesGrpc.newBlockingStub(mChannel); 
    mInviteContactsBlockingStub = InviteContactsGrpc.newBlockingStub(mChannel); 

Ausnahme:

Network channel closed 
    at io.grpc.Status.asRuntimeException(Status.java:431) 
    at io.grpc.stub.ClientCalls.getUnchecked(ClientCalls.java:157) 
    at io.grpc.stub.ClientCalls.blockingUnaryCall(ClientCalls.java:106) 

ich mit dem folgenden Code auch versucht:

mChannel = NettyChannelBuilder.forAddress(GrpcConstants.LOCAL_GRPC_CLIENT_IP, GrpcConstants.LOCAL_GRPC_CLIENT_PORT).sslContext(GrpcSslContexts.forClient().trustManager(file).build()).build(); 

    mEmployerServicesBlockingStub = EmployerServicesGrpc.newBlockingStub(mChannel); 
    mInviteContactsBlockingStub = InviteContactsGrpc.newBlockingStub(mChannel); 

Dies ist auch, wie oben die gleiche Ausnahme geben. Ich habe hier nur eine Nulldatei angegeben.

Bitte lassen Sie mich wissen, welcher Ansatz für ein GoDaddy-Zertifikat verwendet werden soll.

Wenn es der erste Ansatz ist, was fehlt mir.

Wenn es der zweite Ansatz ist, welche Datei soll ich für "roots.pem" verwenden.

Aktualisiert.

Antwort

0

Es sieht so aus, als ob die Ausnahme an der Spitze ein wenig abgeschnitten ist. Es kann auch eine kausale Ausnahme ("verursacht durch:") geben, die hilfreich sein könnte. In beiden Fällen kann dies ähnlich sein wie another issue, wo gRPC den ursprünglichen Fehler "vermisst" und jetzt nur spätere Fehler erkennt.

Beide Ansätze zur Channel-Erstellung sollten funktionieren. Wenn Sie einen Reverseproxy verwenden, würde ich annehmen, dass das Problem entweder der Server ist, der AES GCM oder ALPN nicht unterstützt (mit HTTP/2). Sie können https://www.ssllabs.com/ssltest/ verwenden, um nach Unterstützung zu suchen. Zum Beispiel Google supports both. Wenn Sie einen gRPC-Server direkt kontaktieren, würde ich ein Problem erwarten, das tcnative initialisiert.

Es lohnt sich wahrscheinlich, ein GitHub-Problem zu erstellen, das uns hilft, die wahre Ursache aufzuspüren.

+0

Danke für die Antwort. Ich war in der Lage, eine erfolgreiche Verbindung mit dem Code, der für SSL auf GPC-Dokumentation gegeben wurde, eine Client-Seite .crt-Datei auf dem Client-Code und den privaten Schlüssel und die Server-.crt-Datei auf der Serverseite. –

+0

Immer noch gab es ein anderes Problem. Der Client gab weder eine Ausnahme noch erreichte er den Server. Irgendwie war derselbe Code für SSL durch das Beispielprojekt grep-java github erfolgreich. Der einzige Unterschied, den ich von meinem Projekt zur Beispielimplementierung von grpc-java sehen konnte, ist die Version von osdetector. Ich konnte osdetector 1.4.0 aufgrund dieses Problems nicht hinzufügen (http://stackoverflow.com/questions/37160085/gradle-not-able-to-detect-osdetector-plugin). Während grpc-java 1.4.0 hatte und erfolgreich mit skipcodegen = true param während des Builds gebaut wurde. –

+0

@DivijeNarasimhachar, ich erwarte nicht, dass die osdetector-Version das Problem ist. Die einzige Idee, die ich habe, ist, dass Sie einen falschen SslContext verwenden: 'GrpcSslContexts.forClient()' auf der Serverseite oder 'GrpcSslContexts.forServer()' auf der Client-Seite. Das ist wirklich schwer als Tippfehler zu bemerken, und ich habe gehört, dass Ursachen hängen. –

Verwandte Themen