Comment connecter Grpc (netstandard 2.0) au serveur Grpc.Asp.NetCore (.NET 5.0) en utilisant HTTPS et mon propre certificat? [dupliquer]
J'obtiens cette exception sur le client:
Grpc.Core.RpcException: 'Status (StatusCode = "Unavailable", Detail = "impossible de se connecter à toutes les adresses", DebugException = "Grpc.Core.Internal.CoreErrorDetailException: {" created ":" @ 1606620349.107000000 "," description " : "Impossible de sélectionner le sous-canal", "fichier": "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": "n'a pas réussi à se connecter à toutes les adresses", "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}]}") '
Canal client:
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),
}
);
}
Configuration du serveur:
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>();
});
Quand je viens de supprimer
listenOptions.UseHttps...
sur le serveur et utiliser
ChannelCredentials.Insecure
sur le client, cela fonctionne.
Comment faire communiquer ces deux avec HTTPS et mon propre certificat? Juste un exemple simple de client et de serveur qui fonctionnent sur ces dernières versions de bibliothèques.
Je reçois un appel pour
httpsOptions.OnAuthenticate = (ctx, auth) => { };
en service mais je ne sais pas quoi, si quelque chose d'utile puis-je en faire? Il échoue sur une poignée de main.
Réponses
J'écris la solution ici après que les commentaires contenaient la solution comme qui lit les commentaires ...
Le problème est que le client .net 5.0 est plus rapide et que le client ne peut pas se connecter car le serveur n'est pas prêt à accepter les connexions. Lors du développement du client et du serveur, il est préférable d'avoir 2 solutions avec les projets partagés afin de pouvoir déboguer les deux en même temps en utilisant 2 instances de Visual Studio. Vous pouvez ouvrir la même solution avec plusieurs instances de VS, mais vous commencerez à rencontrer des problèmes différents, par exemple dans la fenêtre intermédiaire et la fenêtre de sortie.