Wie verbinde ich Grpc (netstandard 2.0) mit Grpc.Asp.NetCore Server (.NET 5.0) unter Verwendung von HTTPS und meinem eigenen Zertifikat? [Duplikat]
Ich bekomme diese Ausnahme auf dem Client:
Grpc.Core.RpcException: 'Status (StatusCode = "Nicht verfügbar", Detail = "Verbindung zu allen Adressen konnte nicht hergestellt werden", DebugException = "Grpc.Core.Internal.CoreErrorDetailException: {" created ":" @ 1606620349.107000000 "," description " : "Unterkanal konnte nicht ausgewählt werden", "Datei": "T: \ src \ github \ grpc \ workspace_csharp_ext_windows_x86 \ src \ core \ ext \ filter \ client_channel \ client_channel.cc", "file_line": 4166, "referenced_errors": [ {"created": "@ 1606620349.107000000", "description": "Verbindung zu allen Adressen fehlgeschlagen", "file": "T: \ src \ github \ grpc \ workspace_csharp_ext_windows_x86 \ src \ core \ ext \ filter \ client_channel \ lb_policy \ pick_first \ pick_first.cc "," file_line ": 398," grpc_status ": 14}]}") '
Client-Kanal:
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),
}
);
}
Serverkonfiguration:
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>();
});
Wenn ich gerade entferne
listenOptions.UseHttps...
auf dem Server und verwenden
ChannelCredentials.Insecure
auf dem Client funktioniert es.
Wie können diese beiden mit HTTPS und meinem eigenen Zertifikat kommunizieren? Nur ein einfaches Beispiel für Client und Server, die mit diesen neuesten Versionen von Bibliotheken arbeiten.
Ich bekomme einen Anruf bei
httpsOptions.OnAuthenticate = (ctx, auth) => { };
im Dienst, aber ich weiß nicht was, wenn irgendetwas Nützliches ich damit machen kann? Es schlägt bei einem Handschlag fehl.
Antworten
Ich schreibe die Lösung hier, nachdem die Kommentare die Lösung enthielten, als wer die Kommentare liest ...
Das Problem ist, dass der .net 5.0-Client schneller ist und keine Verbindung herstellen kann, da der Server nicht bereit ist, Verbindungen zu akzeptieren. Wenn Sie Client und Server entwickeln, sollten Sie zwei Lösungen mit den gemeinsam genutzten Projekten verwenden, damit Sie beide gleichzeitig mit zwei Instanzen von Visual Studio debuggen können. Sie können dieselbe Lösung mit mehreren VS-Instanzen öffnen, es treten jedoch unterschiedliche Probleme auf, z. B. im Zwischenfenster und im Ausgabefenster.