La demande HTTPS échoue à l'aide de HttpClient
Je suis en utilisant le code suivant et obtenir HttpRequestException
exception:
using (var handler = new HttpClientHandler())
{
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.SslProtocols = SslProtocols.Tls12;
handler.ClientCertificates.Add(new X509Certificate2(@"C:\certificates\cert.pfx"));
//I also tried to add another certificates that was provided to https access
//by administrators of the site, but it still doesn't work.
//handler.ClientCertificates.Add(new X509Certificate2(@"C:\certificates\cert.crt"));
//handler.ClientCertificates.Add(new X509Certificate2(@"C:\certificates\cert_ca.crt"));
using (var client = new HttpClient(handler))
{
var response = client.GetAsync("https://someurl.com/api.php?arg1=some&arg2=test").GetAwaiter().GetResult();
//^ HttpRequestException: An error occurred while sending the request.
}
}
L'exception:
WinHttpException: A security error occurred
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
System.Runtime.CompilerServices.ConfiguredTaskAwaitable+ConfiguredTaskAwaiter.GetResult()
System.Net.Http.WinHttpHandler+<StartRequest>d__105.MoveNext()
HttpRequestException: An error occurred while sending the request.
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
System.Runtime.CompilerServices.ConfiguredTaskAwaitable+ConfiguredTaskAwaiter.GetResult()
System.Net.Http.HttpClient+<FinishSendAsync>d__58.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
System.Runtime.CompilerServices.TaskAwaiter.GetResult()
MyApp.Web.Controllers.HomeController.Test() in HomeController.cs
var response = client.GetAsync("https://someurl.com/api.php?arg1=some&arg2=test").GetAwaiter().GetResult();
lambda_method(Closure , object , Object[] )
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker+<InvokeActionMethodAsync>d__27.MoveNext()
J'ai aussi essayé d'exporter les mêmes certificats de Magasin de Certificats Windows et l'utiliser via Google Chrome et ça fonctionne très bien (navigateur m'a demandé de confirmer le certificat installé, puis chargé de la ressource).
Pourquoi il ne fonctionne pas dans mon code?
Mis à JOUR
J'ai aussi essayé d'ajouter un rappel pour valider le certificat:
handler.ServerCertificateCustomValidationCallback = (message, certificate2, arg3, arg4) =>
{
//I set a breakpoint to this point but it is not catched.
return true;
};
UPDATED2
Le certificat est utilisé SHA-1. Neil Moss est mentionné dans les commentaires que soutien pour SHA1 certs est retirée.
Si c'est la vraie raison de pourquoi il ne fonctionne pas, est-il la solution?
SOLUTION
Merci Neil Moss pour la solution. Il a proposé d'utiliser le protocole Tls drapeau pour le protocole SSL.
handler.SslProtocols = SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls;
Mais il a également tenu le suivant:
handler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true;
Après j'ai ajouté celle-ci, elle fonctionne très bien.
Salut @Richard, j'ai mis à jour ma question à l'exception des messages et de la pile trakces.
Juste pour être clair, êtes-vous essayer de vous connecter via HTTPS via un certificat du client, ou essayez-vous d'inclure une auto-signé certificat de serveur que vous souhaitez traité comme valide?
Complètement hors-sujet: Pourquoi
client.GetAsync(…).GetAwaiter().GetResult()
? Pourquoi ne pas tout simplement await client.GetAsync(…)
?Est votre certificat signé avec SHA1? Soutien pour SHA1 certs est retiré, - peut-être liée? blogs.windows.com/msedgedev/2016/04/29/sha1-deprecation-roadmap
OriginalL'auteur hcp | 2017-03-12
Vous devez vous connecter pour publier un commentaire.
Selon cette SORTE de post, vous devez activer TLS1.2 avec ServicePointManager.
À noter également, la La documentation MSDN pour ServicePointManager.SecurityProtocols bien fait cette déclaration:
qui suggère qu'une certaine forme de SHA1 bloc pourrait être en place.
System.Net.ServicePointManager.SecurityProtocol
mais j'ai utiliséhandler.SslProtocols = SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls;
Important de noter que pour .net core 2.0, vous aurez besoin d'utiliser HttpClientHandler plutôt que ServicePointManager.
OriginalL'auteur Neil Moss
C'était un document très utile. Pour ASP.NET Core 2.0, la réponse a été appliqué de la façon suivante (le résultat a été un succès):
OriginalL'auteur Debro012