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.

Veuillez donner tous les détails de l'erreur: type de message, et la trace de la pile. Si il y a un intérieur d'exception qu'est-ce que cela?
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