2017-11-13 5 views
1

私はC#の方が新しく、TLSでGRPCを使用する必要があります。C#でのGRPCのTLSサポート

ドライランでは、main grpc repoに記載されている例を変更してTLSを使用しています。これを行うには、私は良い答えのように見えるものと別のSOの質問を見つけました:How to enable server side SSL for gRPC?。しかし、エラーUnhandled Exception: Grpc.Core.RpcException: Status(StatusCode=Unavailable, Detail="Connect Failed")(以下の完全なトレース)が表示されます。

元の非tlsコードで、誤ったポートを指定した場合、またはサーバーを起動しない場合と同じエラーが発生します。私はUbuntuでdotnet coreを使用しています。

コードの重要な部分は次のとおりです。また、フォークのgithubにも記載されています。

クライアント:

var cacert = File.ReadAllText(@"../ca.crt"); 
    var clientcert = File.ReadAllText(@"../client.crt"); 
    var clientkey = File.ReadAllText(@"../client.key"); 
    var ssl = new SslCredentials(cacert, new KeyCertificatePair(clientcert, clientkey)); 
    var channel = new Channel("localhost", 555, ssl); 
    var client = new Greeter.GreeterClient(channel); 

    String user = "you"; 

    var reply = client.SayHello(new HelloRequest {Name = user}); 
    Console.WriteLine("Greeting: " + reply.Message); 

    channel.ShutdownAsync().Wait(); 
    Console.WriteLine("Press any key to exit..."); 
    Console.ReadKey(); 

サーバー:番組の

var cacert = File.ReadAllText(@"../ca.crt"); 
    var servercert = File.ReadAllText(@"../server.crt"); 
    var serverkey = File.ReadAllText(@"../server.key"); 
    var keypair = new KeyCertificatePair(servercert, serverkey); 
    var sslCredentials = new SslServerCredentials(new List<KeyCertificatePair>() {keypair}, cacert, false); 

    var server = new Server 
    { 
    Services = {Greeter.BindService(new GreeterImpl())}, 
    Ports = {new ServerPort("0.0.0.0", 555, sslCredentials)} 
    }; 
    server.Start(); 


    Console.WriteLine("Greeter server listening on port " + Port); 
    Console.WriteLine("Press any key to stop the server..."); 
    Console.ReadKey(); 

    server.ShutdownAsync().Wait(); 

全出力:

$ cd GreeterClient 
$ dotnet run -f netcoreapp1.0 

Unhandled Exception: Grpc.Core.RpcException: Status(StatusCode=Unavailable, Detail="Connect Failed") 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Grpc.Core.Internal.AsyncCall`2.UnaryCall(TRequest msg) 
    at Grpc.Core.DefaultCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method`2 method, String host, CallOptions options, TRequest request) 
    at Grpc.Core.Internal.InterceptingCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method`2 method, String host, CallOptions options, TRequest request) 
    at Helloworld.Greeter.GreeterClient.SayHello(HelloRequest request, CallOptions options) 
    at Helloworld.Greeter.GreeterClient.SayHello(HelloRequest request, Metadata headers, Nullable`1 deadline, CancellationToken cancellationToken) 
    at GreeterClient.Program.Main(String[] args) 

とサーバ:

$ cd GreeterServer/ 
$ dotnet run -f netcoreapp1.0 
Greeter server listening on port 50051 
Press any key to stop the server... 

私はいくつかの間違いを犯しましたか?これはWindows以外のマシンでは実行できませんか?何が起こっているのか把握するために問題をデバッグする方法はありますか?

答えて

2

あなたのコードは自己署名入りの証明書を使って相互TLSを実装しています。私はWindows netcoreで何も変更せずに実行できました。

私は少し証明書の生成スクリプトを微調整するために持っていた

:クライアント/CNに使用CLIENT-COMPUTERNAMEのための環境変数の定義、追加

  • を取り除くために-configオプションを追加(共通名を?) unable to find 'distinguished_name' in configエラー(Windowsの事でopensslのかもしれません)

私はあなたが意図的にホストを不整合でいたのと同じエラーメッセージを再現することができましたクライアントはlocalhostの代わりに127.0.0.1に接続します。だから、あなたは鍵を再生する必要があります。 localhostをクライアントの共通名として使用します。

私は以前に同様のプロジェクトをやっだけサーバーTLSの作業を持っている

- あなたのリンクのおかげで、私はそれを修正することができるかもしれない...

+1

はい、ホストの名前が一致するニーズに接続されていますクライアントチャネルのターゲット(証明書を再生成して一致させる必要があるかもしれません)。 env変数GRPC_VERBOSITY = debugを設定することで、より多くのログを有効にすることにより、より多くの洞察を得ることができます –

関連する問題