繁体   English   中英

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

[英]Is it possible to accept self-signed certificates in Grpc.Core?

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

在文档中,我只看到我可以通过使用自定义根证书(或使用不会验证自签名证书的公共根 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. 是否可以避免将服务器证书安装为根证书?
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

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

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

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

在此处查看我更详细的答案:

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

对于那些有同样问题的人:不幸的是,目前不可能。 C 库允许这样做,但 C# 包装器不允许。 途中有一个拉取请求,但尚未合并: https : //github.com/grpc/grpc/pull/17051

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM