首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法与gRPC建立https连接

无法与gRPC建立https连接
EN

Stack Overflow用户
提问于 2020-04-08 04:00:54
回答 3查看 1.1K关注 0票数 0

我让gRPC客户机/服务器代码在我的本地机器上愉快地工作,客户机使用ChannelCredentials.Insecure,但需要切换到安全模式。我不需要任何证书检查,只是加密的流量。我找不到任何可以相互对话的客户端服务器的配置。运行c#核心服务器(gRPC 2.27.0)和c# .net框架客户端(gRPC 2.28.1)。

服务器说它在http & https上发布,如下所示:

代码语言:javascript
复制
[20:12:58 DBG] Using development certificate: CN=localhost (Thumbprint: 3EDA2E5BD559D75C9DCF058E0A6994EED859CD34)
[20:12:58 INF] Now listening on: https://localhost:5001
[20:12:58 INF] Now listening on: http://localhost:5000

和客户端一起工作:

代码语言:javascript
复制
 ChannelBase channel = new Channel("localhost:5000", ChannelCredentials.Insecure);
 var client = new MyApp.MyAppClient(channel);
 var response = client.Test(request)

如果我将客户端切换到SslCredentials,如下所示

代码语言:javascript
复制
 ChannelBase channel = new Channel("localhost:5001", new SslCredentials());
 var client = new MyApp.MyAppClient(channel);
 var response = client.Test(request)

我得到了以下错误。

服务器错误

代码语言:javascript
复制
[19:32:53 DBG] Failed to authenticate HTTPS connection.
System.IO.IOException: Authentication failed because the remote party has closed the transport stream.
   at System.Net.Security.SslStream.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslStream.PartialFrameCallback(AsyncProtocolRequest asyncRequest)

客户端错误

代码语言:javascript
复制
Grpc.Core.RpcException: 'Status(StatusCode=Unavailable, Detail="failed to connect to all addresses")'

我还尝试添加(server),但没有更改错误。

代码语言:javascript
复制
   services.AddAuthentication(CertificateAuthenticationDefaults.AuthenticationScheme)
      .AddCertificate(options =>
      {
          options.RevocationMode = X509RevocationMode.NoCheck;
          options.ValidateCertificateUse = false;
          options.AllowedCertificateTypes = CertificateTypes.SelfSigned;
      });

我需要怎么做才能让他们开口说话。

EN

回答 3

Stack Overflow用户

发布于 2020-04-23 23:33:22

因此,在创建SslCredentials时,您需要指定与服务器上使用的开发证书相对应的roots.pem。

如果你使用无参数的SslCredentials(),它将使用默认的信任根,该根只适用于由公开信任的证书颁发机构签署的证书(例如,如果你谈论的是googleapis.com等“官方”服务器,那么你在服务器上使用的开发证书肯定不是这样的)。所以你需要使用SslCredentials(yourCustomTrustRootsPem)。

顺便说一句,有了SSL/TLS,就没有“无证书检查”这回事了。客户端将始终检查它是否连接到正确的服务器(服务器的证书可通过其信任根进行验证)-否则,安全通信将毫无意义,因为它太容易受到中间人攻击。(服务器检查客户端的真实性是可选的)。

请随时参考https://github.com/jtattermusch/grpc-authentication-kubernetes-examples以获取额外的资源。

票数 0
EN

Stack Overflow用户

发布于 2020-08-25 22:56:12

我遇到了类似的问题,最终找到了一种解决方案,可以在

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

事实上,Jan Tattermusch的答案是正确的。您需要将服务器端证书作为PEM提供给SslCredentials的构造函数,此外,证书还必须包含与服务器联系的url的DNS名称或IP。在您的情况下,我建议手动为每个服务器创建自签名证书,而不是使用开发人员证书。您的客户端可以下载此文件,然后将其作为SslCredentials传递。就像一种护身符。

在我对类似问题的回答中,请参阅我的更多详细信息:

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

票数 0
EN

Stack Overflow用户

发布于 2020-09-18 22:47:22

尝试在部署后以windows服务或其他方式检查Grpc服务正在运行的端口,然后在客户端提供相同的端口以使用该服务。例如:如果你的服务是在https://localhost:5000上运行的,那么在客户端也是一样的。它肯定会工作的。

大多数情况下,当你犯了服务地址和客户端地址不匹配的错误时,你会得到上面的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61088462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档