我让gRPC客户机/服务器代码在我的本地机器上愉快地工作,客户机使用ChannelCredentials.Insecure,但需要切换到安全模式。我不需要任何证书检查,只是加密的流量。我找不到任何可以相互对话的客户端服务器的配置。运行c#核心服务器(gRPC 2.27.0)和c# .net框架客户端(gRPC 2.28.1)。
服务器说它在http & https上发布,如下所示:
[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和客户端一起工作:
ChannelBase channel = new Channel("localhost:5000", ChannelCredentials.Insecure);
var client = new MyApp.MyAppClient(channel);
var response = client.Test(request)如果我将客户端切换到SslCredentials,如下所示
ChannelBase channel = new Channel("localhost:5001", new SslCredentials());
var client = new MyApp.MyAppClient(channel);
var response = client.Test(request)我得到了以下错误。
服务器错误
[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)客户端错误
Grpc.Core.RpcException: 'Status(StatusCode=Unavailable, Detail="failed to connect to all addresses")'我还尝试添加(server),但没有更改错误。
services.AddAuthentication(CertificateAuthenticationDefaults.AuthenticationScheme)
.AddCertificate(options =>
{
options.RevocationMode = X509RevocationMode.NoCheck;
options.ValidateCertificateUse = false;
options.AllowedCertificateTypes = CertificateTypes.SelfSigned;
});我需要怎么做才能让他们开口说话。
发布于 2020-04-23 23:33:22
因此,在创建SslCredentials时,您需要指定与服务器上使用的开发证书相对应的roots.pem。
如果你使用无参数的SslCredentials(),它将使用默认的信任根,该根只适用于由公开信任的证书颁发机构签署的证书(例如,如果你谈论的是googleapis.com等“官方”服务器,那么你在服务器上使用的开发证书肯定不是这样的)。所以你需要使用SslCredentials(yourCustomTrustRootsPem)。
顺便说一句,有了SSL/TLS,就没有“无证书检查”这回事了。客户端将始终检查它是否连接到正确的服务器(服务器的证书可通过其信任根进行验证)-否则,安全通信将毫无意义,因为它太容易受到中间人攻击。(服务器检查客户端的真实性是可选的)。
请随时参考https://github.com/jtattermusch/grpc-authentication-kubernetes-examples以获取额外的资源。
发布于 2020-08-25 22:56:12
我遇到了类似的问题,最终找到了一种解决方案,可以在
事实上,Jan Tattermusch的答案是正确的。您需要将服务器端证书作为PEM提供给SslCredentials的构造函数,此外,证书还必须包含与服务器联系的url的DNS名称或IP。在您的情况下,我建议手动为每个服务器创建自签名证书,而不是使用开发人员证书。您的客户端可以下载此文件,然后将其作为SslCredentials传递。就像一种护身符。
在我对类似问题的回答中,请参阅我的更多详细信息:
发布于 2020-09-18 22:47:22
尝试在部署后以windows服务或其他方式检查Grpc服务正在运行的端口,然后在客户端提供相同的端口以使用该服务。例如:如果你的服务是在https://localhost:5000上运行的,那么在客户端也是一样的。它肯定会工作的。
大多数情况下,当你犯了服务地址和客户端地址不匹配的错误时,你会得到上面的问题。
https://stackoverflow.com/questions/61088462
复制相似问题