.net-core - 如何使用 HTTPS 和我自己的证书将 Grpc(netstandard 2.0)与 Grpc.Asp.NetCore 服务器(.NET 5.0)连接起来?
问题描述
我在客户端收到此异常:
Grpc.Core.RpcException: 'Status(StatusCode="Unavailable", Detail="无法连接到所有地址", DebugException="Grpc.Core.Internal.CoreErrorDetailException: {"created":"@1606620349.107000000","description" :"未能选择子频道","文件":"T:\src\github\grpc\workspace_csharp_ext_windows_x86\src\core\ext\filters\client_channel\client_channel.cc","file_line":4166,"referenced_errors":[ {"created":"@1606620349.107000000","description":"连接所有地址失败","file":"T:\src\github\grpc\workspace_csharp_ext_windows_x86\src\core\ext\filters\client_channel\lb_policy \pick_first\pick_first.cc","file_line":398,"grpc_status":14}]}")'
客户渠道:
private Channel GetChannel()
{
return new Channel(
_settings.FileServiceUri
, CertificatePEM == null ? ChannelCredentials.Insecure :
new SslCredentials(
CertificatePEM
, new KeyCertificatePair(CertificatePEM, File.ReadAllText("Syrilium.FileUpdater.cer.key"))
)
, new[] {
new ChannelOption(ChannelOptions.MaxReceiveMessageLength,int.MaxValue),
new ChannelOption(ChannelOptions.MaxSendMessageLength,int.MaxValue),
}
);
}
服务器配置:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureKestrel(kestrelOptions =>
{
var sslCertificate = LoadSSLCertificate();
kestrelOptions.ListenAnyIP(/*IPAddress.Parse("127.0.0.1"),*/ 5001
, listenOptions =>
{
listenOptions.UseHttps(
sslCertificate,
httpsOptions =>
{
//httpsOptions.SslProtocols = SslProtocols.Tls12;
httpsOptions.ClientCertificateMode = ClientCertificateMode.AllowCertificate;
httpsOptions.ClientCertificateValidation = (certificate, chain, errors) =>
{
return true /*certificate.Thumbprint.Equals(_clientThumbprint, StringComparison.OrdinalIgnoreCase)*/;
};
}
);
listenOptions.Protocols = HttpProtocols.Http2;
}
);
});
webBuilder.UseStartup<Startup>();
});
当我刚刚删除
listenOptions.UseHttps...
在服务器上并使用
ChannelCredentials.Insecure
在客户端上,它可以工作。
如何使这两者与 HTTPS 和我自己的证书进行通信?只是在这些最新版本的库上工作的客户端和服务器的一个简单示例。
我接到电话
httpsOptions.OnAuthenticate = (ctx, auth) => { };
在服务中,但我不知道如果有什么有用的,我可以用它做什么?握手失败。
解决方案
在评论包含解决方案后,我在此处编写解决方案,因为谁阅读了评论...
问题是 .net 5.0 客户端速度更快,并且客户端无法连接,因为服务器尚未准备好接受连接。在开发客户端和服务器时,最好使用共享项目的 2 个解决方案,以便您可以使用 2 个 Visual Studio 实例同时调试两者。您可以使用多个 VS 实例打开相同的解决方案,但是您将开始遇到不同的问题,例如在中间窗口和输出窗口中。
推荐阅读
- ios - Swift Compact Map 返回空
- php - wordpress - 我怎样才能在主页上发布一个类别的帖子(只有一个类别的新闻)
- java - 不同类型的泛型
- javascript - 使用 Socket.IO 更新 EJS 模板
- javascript - Javascript 搜索引擎不工作
- asp.net-mvc - ASP.Net MVC 中的自定义错误页面
- ffmpeg - 使用 ffmpeg 将脉冲音频记录为 CAP_SYS_ADMIN
- android-studio - Android Studio 错误:VCPU 关闭请求
- ios - 使用 react-native-navigation 将 react native 应用程序与现有的 iOS 应用程序集成
- pandas - 如何使用 to_gbq() 将数据帧写入日期分区 BQ 表的特定分区