如何将 .NET Framework 中的 gRPC 客户端连接到安全的 .NET Core 服务器?
How can I connect a gRPC client in .NET framework with a secure .NET Core server?
我在 .NET Core 服务器上使用 protobuf-net.Grpc 并尝试从 .NET Framework (4.7.2.) gRPC 客户端进行调用。一个完整的例子在这里:https://github.com/angelagyang/GRPCProtobufExample
这是我的客户的一个片段:
var channelCreds = new SslCredentials(GetRootCertificates());
var channel = new Channel("localhost", 5001, channelCreds);
var greeter = channel.CreateGrpcService<IGreeterService>();
使用此配置,我在调用服务器时收到错误 StatusCode="Unknown", Detail="Stream removed"...
。如果我在服务器上设置 ClientCertificateMode = ClientCertificateMode.NoCertificate
,我就可以连接到服务器。 但是,我希望服务器require a client certificate and validate the certificate via thumbprint。
例如,在 .NET Core 中,我可以使用 Grpc.Net.Client 来配置我的频道,如下所示:
var handler = new HttpClientHandler();
handler.ClientCertificates.Add(certificate);
var channel2 = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions
{
HttpHandler = handler
});
有没有办法像这样在 .NET Framework 中配置带有证书的客户端?我是 gRPC/.NET 的新手,非常感谢任何建议!
解决并更新了原始示例:https://github.com/angelagyang/GRPCProtobufExample
您可以通过创建 KeyCertificatePair
to pass into SslCredentials
来配置客户端证书。您将需要 PEM 编码的证书链和 PEM 编码的私钥。
var keyCertPair = new KeyCertificatePair(File.ReadAllText($"{rootDir}/cert.pem"), File.ReadAllText($"{rootDir}/cert.key"));
var channelCreds = new SslCredentials(GetRootCertificates(), keyCertPair);
出于测试目的,我在这里使用了自签名证书:https://github.com/grpc/grpc/tree/master/src/core/tsi/test_creds
调试时,设置GRPC_VERBOSITY = DEBUG
和GRPC_DEBUG = ALL
。这有助于清除模糊的错误消息。例如,我意识到我用来配置 HTTPS 的服务器证书不包括 localhost。
根据我的尝试和工作,您可以跳过必须阅读 cert.pem
和 cert.key
的工作。此外,GetRootCertificate()
只有在服务器系统托管在众所周知的可信网站(如 google.com
或 msdn.com
或类似网站和本地主机上时才有效。可以找到更详细的答案here and here
如果我们打算使用我们自己的主机 DNS 和 SSL,在 pfx
中生成服务器证书分配给您的 DNS 并将其转换为 pem
用于客户端应用程序是您的方法。
使用openssl之类的工具将有助于转换证书编码。
openssl pkcs12 -in "<DiskLocationOfPfx>\ProjectName.pfx" -out "<TargetLocation>\certifcate.pem" -clcerts
将服务器证书转换为 pem 后,您可以使用
var channelCreds = new SslCredentials(File.ReadAllText($"{rootDir}/cert.pem"));
var channel = new Channel("www.youdns.com", 5001, secureCredentials);
我在 .NET Core 服务器上使用 protobuf-net.Grpc 并尝试从 .NET Framework (4.7.2.) gRPC 客户端进行调用。一个完整的例子在这里:https://github.com/angelagyang/GRPCProtobufExample
这是我的客户的一个片段:
var channelCreds = new SslCredentials(GetRootCertificates());
var channel = new Channel("localhost", 5001, channelCreds);
var greeter = channel.CreateGrpcService<IGreeterService>();
使用此配置,我在调用服务器时收到错误 StatusCode="Unknown", Detail="Stream removed"...
。如果我在服务器上设置 ClientCertificateMode = ClientCertificateMode.NoCertificate
,我就可以连接到服务器。 但是,我希望服务器require a client certificate and validate the certificate via thumbprint。
例如,在 .NET Core 中,我可以使用 Grpc.Net.Client 来配置我的频道,如下所示:
var handler = new HttpClientHandler();
handler.ClientCertificates.Add(certificate);
var channel2 = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions
{
HttpHandler = handler
});
有没有办法像这样在 .NET Framework 中配置带有证书的客户端?我是 gRPC/.NET 的新手,非常感谢任何建议!
解决并更新了原始示例:https://github.com/angelagyang/GRPCProtobufExample
您可以通过创建 KeyCertificatePair
to pass into SslCredentials
来配置客户端证书。您将需要 PEM 编码的证书链和 PEM 编码的私钥。
var keyCertPair = new KeyCertificatePair(File.ReadAllText($"{rootDir}/cert.pem"), File.ReadAllText($"{rootDir}/cert.key"));
var channelCreds = new SslCredentials(GetRootCertificates(), keyCertPair);
出于测试目的,我在这里使用了自签名证书:https://github.com/grpc/grpc/tree/master/src/core/tsi/test_creds
调试时,设置GRPC_VERBOSITY = DEBUG
和GRPC_DEBUG = ALL
。这有助于清除模糊的错误消息。例如,我意识到我用来配置 HTTPS 的服务器证书不包括 localhost。
根据我的尝试和工作,您可以跳过必须阅读 cert.pem
和 cert.key
的工作。此外,GetRootCertificate()
只有在服务器系统托管在众所周知的可信网站(如 google.com
或 msdn.com
或类似网站和本地主机上时才有效。可以找到更详细的答案here and here
如果我们打算使用我们自己的主机 DNS 和 SSL,在 pfx
中生成服务器证书分配给您的 DNS 并将其转换为 pem
用于客户端应用程序是您的方法。
使用openssl之类的工具将有助于转换证书编码。
openssl pkcs12 -in "<DiskLocationOfPfx>\ProjectName.pfx" -out "<TargetLocation>\certifcate.pem" -clcerts
将服务器证书转换为 pem 后,您可以使用
var channelCreds = new SslCredentials(File.ReadAllText($"{rootDir}/cert.pem"));
var channel = new Channel("www.youdns.com", 5001, secureCredentials);