Jak połączyć Grpc (netstandard 2.0) z serwerem Grpc.Asp.NetCore (.NET 5.0) przy użyciu protokołu HTTPS i własnego certyfikatu? [duplikować]
Mam ten wyjątek od klienta:
Grpc.Core.RpcException: 'Status (StatusCode = "Unavailable", Detail = "nie udało się połączyć ze wszystkimi adresami", DebugException = "Grpc.Core.Internal.CoreErrorDetailException: {" created ":" @ 1606620349.107000000 "," description " : "Nie udało się wybrać podkanału", "plik": "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": "nie udało się połączyć ze wszystkimi adresami", "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}]}") '
Kanał klienta:
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),
}
);
}
Konfiguracja serwera:
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>();
});
Kiedy po prostu usuwam
listenOptions.UseHttps...
na serwerze i użyj
ChannelCredentials.Insecure
na kliencie to działa.
Jak sprawić, by te dwie osoby komunikowały się za pomocą protokołu HTTPS i mojego własnego certyfikatu? Prosty przykład klienta i serwera, które działają na najnowszych wersjach bibliotek.
Mam telefon do
httpsOptions.OnAuthenticate = (ctx, auth) => { };
w serwisie, ale nie wiem co, jeśli coś pożytecznego mogę z tym zrobić? Nie udaje się przy uścisku dłoni.
Odpowiedzi
Piszę tutaj rozwiązanie po komentarzach zawierających rozwiązanie jak kto czyta komentarze ...
Problem polega na tym, że klient .net 5.0 jest szybszy i klient nie może się połączyć, ponieważ serwer nie jest gotowy do przyjmowania połączeń. Podczas opracowywania klienta i serwera najlepiej jest mieć 2 rozwiązania ze współdzielonymi projektami, aby można było debugować oba w tym samym czasie przy użyciu 2 wystąpień programu Visual Studio. Możesz otworzyć to samo rozwiązanie w kilku wystąpieniach VS, jednak zaczniesz napotykać różne problemy, na przykład w oknie pośrednim i oknie wyjściowym.