gpt4 book ai didi

c# - 在 C# 控制台应用程序中实现的 gRPC 中收到的客户端证书为空

转载 作者:行者123 更新时间:2023-12-04 22:43:22 25 4
gpt4 key购买 nike

我正在用 C# 实现一个简单的 gRPC 项目,如 official docs 中所列。 .它非常简单,有 2 个项目:

  • gRPC 服务 - 包含 gRPC 服务
  • C# 控制台应用程序 - 调用 gRPC 服务

  • gRPC服务方法调用代码如下:
    public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
    {
    var httpContext = context.GetHttpContext();
    var clientCertificate = httpContext.Connection.ClientCertificate;

    return Task.FromResult(new HelloReply
    {
    Message = "Hello " + request.Name
    });
    }
    请注意,我正在尝试将客户端证书读取为:

    var httpContext = context.GetHttpContext();

    var clientCertificate = httpContext.Connection.ClientCertificate;


    问题是我收到客户端证书的空值。我通过在 Visual Studio 中放置断点来检查它。为什么会这样?
    调用此 gRPC 服务的 C# 控制台应用程序是:
    static async Task Main(string[] args)
    {
    // The port number(5001) must match the port of the gRPC server.
    var basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location);
    var cert = new X509Certificate2(Path.Combine(basePath, "client.pfx"), "1234");
    var handler = new HttpClientHandler();
    handler.ClientCertificates.Add(cert);
    var httpClient = new HttpClient(handler);

    var channel = GrpcChannel.ForAddress("https://localhost:5001/", new GrpcChannelOptions
    {
    HttpClient = httpClient
    });
    var grpc = new Greeter.GreeterClient(channel);
    var response = await grpc.SayHelloAsync(new HelloRequest { Name = "Bob" });
    Console.WriteLine(response.Message);
    }
    在这里,我在代码行中添加证书:

    var cert = new X509Certificate2(Path.Combine(basePath, "client.pfx"), "1234");

    var handler = new HttpClientHandler();

    handler.ClientCertificates.Add(cert);


    为什么收到的证书是空的?

    最佳答案

    经过大量研究后,我找到了答案,并希望对其他人也有帮助。在gRPC服务项目中,转到CreateHostBuilder() Program.cs 的功能和 将 Kestrel 配置为需要客户端证书 .以下代码行是执行此工作的代码行:

    public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
    .ConfigureWebHostDefaults(webBuilder =>
    {
    webBuilder.UseStartup<Startup>();
    //configure to require client certificate
    webBuilder.ConfigureKestrel(o =>
    {
    o.ConfigureHttpsDefaults(o =>
    o.ClientCertificateMode = ClientCertificateMode.RequireCertificate);
    });
    });

    关于c# - 在 C# 控制台应用程序中实现的 gRPC 中收到的客户端证书为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61729583/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com