首页 > 解决方案 > gRPC 中的安全性如何发挥作用?

问题描述

我有一项以这种方式配置的服务:

options.Listen(miAddress, 5001, l =>
{
    l.Protocols = HttpProtocols.Http2;
    System.Security.Cryptography.X509Certificates.X509Certificate2 miCertificado = new System.Security.Cryptography.X509Certificates.X509Certificate2(@"certificados\service.crt");
    l.UseHttps(miCertificado);
});

但是,如果我意识到我可以配置客户端以避免身份验证,则使用以下代码:

var httpClientHandler = new System.Net.Http.HttpClientHandler();
httpClientHandler.ServerCertificateCustomValidationCallback =
    System.Net.Http.HttpClientHandler.DangerousAcceptAnyServerCertificateValidator;
var httpClient = new System.Net.Http.HttpClient(httpClientHandler);

var channel = GrpcChannel.ForAddress(_serviceAddress,
    new GrpcChannelOptions { HttpClient = httpClient });
var client = new Gestor.GestorClient(channel);

在这种情况下,身份验证被忽略,我可以使用对服务的调用。

我知道这会忽略身份验证,因为如果我尝试使用客户端来使用证书,我会收到一个错误消息,指出由于 SSL 连接无法稳定。

所以我的疑问是,有什么方法可以将服务设置为不允许这种连接?如果没有,任何人都可以创建一个客户端来进行此身份验证,并且安全性毫无意义。

谢谢。

标签: c#grpc

解决方案


使用 HTTPS 与使用身份验证不同。您所做的只是加密客户端和服务器之间的流量,以便窃听者无法读取您的明文流量。

如果您将客户端配置为接受任何服务器证书,无论该证书在其根之前是否有效,都不会“忽略身份验证” - 开始时没有身份验证。


推荐阅读