c# - 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 连接无法稳定。
所以我的疑问是,有什么方法可以将服务设置为不允许这种连接?如果没有,任何人都可以创建一个客户端来进行此身份验证,并且安全性毫无意义。
谢谢。
解决方案
使用 HTTPS 与使用身份验证不同。您所做的只是加密客户端和服务器之间的流量,以便窃听者无法读取您的明文流量。
如果您将客户端配置为接受任何服务器证书,无论该证书在其根之前是否有效,都不会“忽略身份验证” - 开始时没有身份验证。
推荐阅读
- csv - JMeter 抛出“文件从不保留”错误
- metal - 如何通过 Metal 再次提交相同的命令?
- asp.net-mvc - 添加子实体在本地有效,但在实时 Azure 站点上无效
- azure-devops - 以编程方式访问 Azure Devops 中的管道变量组
- sql - SQL Select:匹配id的行是否都具有相同的列值
- testing - 对哪种类型的测试感到困惑——理智、烟雾或回归
- java - 主线程在 CompletableFuture 完成之前退出
- reactjs - React - 取消注册已注册的服务人员
- php - PHP Laravel 多次返回
- python-3.x - pandas - 在具有不同位置的不同字符集之间提取数字