是否可以在Grpc.Core中接受自签名证书?

时间:2019-03-26 19:02:46

标签: c# .net ssl grpc

场景:我有一个用C#实现的客户端,应该使用SSL加密的Connection使用gRPC连接到服务器。但是,服务器使用的证书可以是自签名的,也可以不是。

在文档中,我仅看到我可以使用自定义根证书(或使用不会验证自签名证书的公共根CA)来设置不安全(完全没有SSL)或安全的通道凭据),这实际上意味着我必须确保以root用户身份安装自签名服务器证书。基本上,我该如何以编程方式做到这一点?

var channelCredentials = new SslCredentials(rootAsPem); 
// FIXME: specify that channelCredentials can accept self-signed certificates or fetch certificates?
var channel = new Channel("myservice.example.com", channelCredentials);
var client = new Greeter.GreeterClient(channel);

我要实现的是询问用户,例如“嘿,您配置的服务器使用自签名证书,您同意吗?”如果是这样,请在PEM中将证书安装为根证书。

我现在的主要问题是:

  1. 我如何获得服务器证书?我目前得到的只是一个例外。
  2. 是否可以避免将服务器证书安装为根证书?

3 个答案:

答案 0 :(得分:2)

var httpClientHandler = new HttpClientHandler();
// Return `true` to allow certificates that are untrusted/invalid
httpClientHandler.ServerCertificateCustomValidationCallback = 
    HttpClientHandler.DangerousAcceptAnyServerCertificateValidator;
var httpClient = new HttpClient(httpClientHandler);
var channel = GrpcChannel.ForAddress("https://localhost:5001",
    new GrpcChannelOptions { HttpClient = httpClient });
var client = new Greet.GreeterClient(channel);

https://docs.microsoft.com/en-us/aspnet/core/grpc/troubleshoot?view=aspnetcore-3.0

答案 1 :(得分:2)

我遇到了类似的问题,终于找到了一种在两者之间建立HTTP连接的解决方案

  • .NET Framework 4.7.2客户端(WPF应用)和
  • ASP .NET Core 3.1 gRPC服务器(控制台)。

解决方案的关键是首先在gRPC目标服务器上使用常规object.resetMatrix(); object.rotateX(ConvertToRadians(pitch)); HttpClient下载服务器证书。通过Get及其HttpClientHandler,您可以获得服务器的X509证书,并检查它是否是自签名证书,以提示用户确认可能不安全的连接。如果为Confirmend,则可以将证书导出为PEM格式的字符串,然后在ServerCertifacteCustomValidationCallback的构造函数中使用它。还有另一件事很重要:证书必须包含DNS名称或您通过其与服务器联系的URL的IP,因为客户端对此进行了检查。通过启用gRPC客户端调试,您可以看到详细的错误:

在这里查看我的更详细的答案:

https://stackoverflow.com/a/63565090/378415

答案 2 :(得分:0)

对于那些有相同问题的人:不幸的是,目前尚不可能。 C库确实允许这样做,但是C#包装程序却不允许。正在进行拉取请求,但尚未合并:https://github.com/grpc/grpc/pull/17051