web-dev-qa-db-fra.com

Échec de l'authentification de la connexion HTTPS lors de la tentative d'obtention de GET à partir de WebApi

J'utilise ASP.Net Core et j'ai 2 projets.

  1. Application ASP.Net Core MVC
  2. Application ASP.Net Core WebApi

Si j'essaie l'un des points d'extrémité WebApi à l'aide de Postman, je n'ai aucun problème et les valeurs/api/retournent comme prévu (point de terminaison de test standard)

Cependant, si j'essaie la même opération en utilisant l'application MVC, j'obtiens une erreur très frustrante:

HttpsConnectionFilter[1]
Failed to authenticate HTTPS connection

J'héberge en utilisant Kestrel pour le noyau Asp.Net.

J'ai un certificat PFX auto-signé que j'ai créé à l'aide de powershell, et voici le code levant l'exception:

var handler = new HttpClientHandler();
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.SslProtocols = SslProtocols.Tls12;
handler.ClientCertificates.Add(new X509Certificate2("localcert.pfx", "xxx"));
var client = new HttpClient(handler);

var content = await client.GetStringAsync("https://localhost:44301/api/values");

Et j'obtiens la même erreur si je devais exécuter ceci:

var client = new HttpClient();

var content = await client.GetStringAsync("https://localhost:44301/api/values");

Ma configuration Kestrel est comme ça dans mon Program.cs

var cert = new X509Certificate2("localcert.pfx", "xxx");

var Host = new WebHostBuilder()
    .UseKestrel(cfg => cfg.UseHttps(cert))
    .UseUrls("https://localhost:44300")
    .UseContentRoot(Directory.GetCurrentDirectory())
    .UseIISIntegration()
    .UseStartup<Startup>()
    .Build();

Host.Run();

Je sais que j'ai à nouveau défini le certificat pour le HttpClient ci-dessus, mais je suis désespéré.

Quelqu'un peut-il nous expliquer pourquoi cela se produit et comment je peux y remédier, ou même le déboguer, car cela me rend fou. Je suis en train de parcourir et de parcourir le code KestrelHttpServer pour voir si cela offrira un aperçu.

C'est l'erreur complète que j'obtiens de la fenêtre de la console Kestrel

info: HttpsConnectionFilter 1 Échec de l'authentification de la connexion HTTPS. System.IO.IOException: l'authentification a échoué car la partie distante a fermé le flux de transport. à System.Net.Security.SslState.StartReadFrame (Byte [] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest) à System.Net.Security.SslState.PartialFrameCallback (AsyncProtocolRequest asyncRequest) --- Fin de la trace de pile à partir de l'emplacement précédent --- sur System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () sur System.Net.Security.SslState.InternalEndProcessAuthentication (LazyAsyncResult lazyResult) sur System.Net.Security.SslState.EndProcessAuthentication (IAsyncResult.Security). SslStream.EndAuthenticateAsServer (IAsyncResult asyncResult) sur System.Threading.Tasks.TaskFactory1.FromAsyncCoreLogic(IAsyncResult iar, Func2 endFunction, Action1 endAction, Task1 promesse, Boolean requiresSynchronization) --- Fin de la trace de la pile à partir de l'emplacement précédent où l'exception a été levée --- sur System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () sur System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (tâche de tâche) sur Microsoft.AspNetCore.Server.Kestrel.Https.HttpsConnectionFilter.d__6.MoveNext ()

12
pieperu

J'ai eu le même problème. Après plusieurs heures de vérification de tout ce qui est possible et même de certaines choses impossibles, j'ai réussi à remonter au certificat SSL généré de manière incorrecte.

Je créais le mien selon ce manuel: Comment: créer votre propre certificat de test .

Le certificat est généré à l'aide de cette commande:

makecert -sv yourprivatekeyfile.pvk -n "cert name" yourcertfile.cer -r

où si -r est omis, l'erreur décrite se produit.

Ensuite, pfx doit être généré conformément au manuel. Si l'on utilise juste cer, Kestrel ne démarrera pas correctement.

Je l'ai résolu en générant un nouveau certificat SSL.

3
Matyas