当前位置: 首页 > 知识库问答 >
问题:

C#grpc服务器端唯一证书

漆雕奇
2023-03-14

有人知道如何配置grpc使用服务器端证书(不是默认的dev证书)的例子吗?所以没有客户端证书,只有一个服务器端证书来加密通道。

我创建了一个自签名pfx,并将其导入受信任的根证书颁发机构。使用以下配置atm:

            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.ConfigureKestrel(o =>
                {
                    o.ConfigureHttpsDefaults(x =>
                    {
                        x.ClientCertificateMode = ClientCertificateMode.NoCertificate;
                        x.ServerCertificate = GetCertificate(StoreLocation.LocalMachine, StoreName.CertificateAuthority, "<thumbprint>");
                    });
                });
                webBuilder.UseStartup<Startup>();
            });

  "profiles": {
"Aeternum.ServiceHost": {
  "commandName": "Project",
  "dotnetRunMessages": "true",
  "launchBrowser": false,
  "applicationUrl": "https://localhost:15425",  //the pfx was created for localhost
  "environmentVariables": {
    "ASPNETCORE_ENVIRONMENT": "Development"
  }
}

  "Kestrel": {
"Url": "https://*:15425",
"EndpointDefaults": {
  "Protocols": "Http2"
}

在这个客户身上尝试一下(我很确定ChannelCredentials。没有安全感是不正确的,但是我不知道在那里还能做什么):

        var channel = new Channel(rootUri.Host, _rootUri.Port, ChannelCredentials.Insecure);
        return new AuthServiceV1.AuthServiceV1Client(channel);

目前,我在客户端得到这个异常(没有ssl,一切似乎都很好):

Status(StatusCode= "不可用",Detail= "无法连接到所有地址",DebugException="Grpc。core . internal . coreerrordetailexception:{ " created ":" @ 1628428855.871000000 "," description ":"选取子通道失败","文件":"......\ src \ core \ ext \ filters \ client _ channel \ client _ channel . cc "," file_line":3009," referenced _ errors ":[{ " created ":" @ 1628428855.871000000 "," description ":"连接所有地址失败"," file ":"......\ src \ core \ ext \ filters \ client _ channel \ lb _ policy \ pick _ first \ pick _ first . cc "," file_line":398," grpc_status":14}]}))

谢谢。

共有1个答案

华衡
2023-03-14

所以我找到了解决办法。

服务器:

  "CertThumbprint": "<certificate thumbprint>",
  "Kestrel": {
    "EndpointDefaults": {
      "Url": "https://*:15425",
      "Protocols": "Http2"
    }
  },

        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.ConfigureKestrel((context, options) =>
            {
                options.ConfigureHttpsDefaults(x =>
                {
                    var thumbprint = context.Configuration["CertThumbprint"];
                    x.ClientCertificateMode = ClientCertificateMode.NoCertificate;
                    x.ServerCertificate = GetCertificate(StoreLocation.LocalMachine, StoreName.CertificateAuthority, thumbprint);
                });
            });
            webBuilder.UseStartup<Startup>();
        });

在客户端中,不要自己创建通道,而是使用grpc客户端工厂:

    services.AddGrpcClient<AuthServiceV1.AuthServiceV1Client>((sp, o) =>
        {
            var configuration = sp.GetRequiredService<IConfiguration>();
            var serviceUrl = configuration["ServiceUrl"];
            o.Address = new Uri(serviceUrl);
        })
        .AddInterceptor<ClientInterceptor>();

services.AddTransient<AuthService>();

最后是服务类本身:

    public class AuthService
    {
        public AuthService(AuthServiceV1.AuthServiceV1Client client)
        {
            _client = client;
        }

        private readonly AuthServiceV1.AuthServiceV1Client _client;

        ...
    }
}
 类似资料:
  • 我正在用C++开发双向流gRPC。我想在服务器端设置一个超时限制,如果连接超过一个阈值,就关闭连接。 但是我发现的唯一超时机制是在客户端(https://grpc.io/blog/deadlines/#c)。我找不到任何API可以用于ServerContext(https://grpc.github.io/grpc/cpp/classgrpc_1_1_server_context.html)。有人

  • 下面的代码片段显示了如何在gRPC AspNet核心应用程序中启用gRPC web: 客户端应用程序的代码如下所示:

  • 我需要使用拦截器验证并记录grpc服务请求的一些数据。我检查了ServerInterceptor的interceptCall,但找不到获取请求对象的方法。有没有办法让请求对象进入拦截器?

  • gRPC 官方文档中的 quickstart - php, 很容易给 PHPer 产生误导, 按照官网的文档, 运行起来 gRPC 服务就很麻烦, 更不用说整套的 RPC 服务了. 推荐阅读 tech| 再探 grpc, 讲解了在 PHP 中实现 gRPC 相关基础知识. hyperf 对 gRPC 支持做了更进一步的封装, hyperf-skeleton 项目为例, 详细讲解整个步骤: .pro

  • 我试图为双向流API编写一个cpp客户端。 通过下面的客户端代码,我可以在服务器上实例化一个流观察器。但是,问题在于调用服务器StreamObserver上的onNext函数。

  • gRPC新手,找不到任何关于如何在服务器端启用SSL的例子。我使用openssl生成了一个密钥对,但是它报错说私钥无效。 这是我的代码