c# HTTPS अनुरोध HttpClient का उपयोग करने में विफल रहता है



asp.net-core .net-core (1)

इस SO पोस्ट के अनुसार, आपको TLS1.2 को ServicePointManager के साथ सक्षम करना होगा।

System.Net.ServicePointManager.SecurityProtocol =
    SecurityProtocolType.Tls12 | 
    SecurityProtocolType.Tls11 | 
    SecurityProtocolType.Tls; // comparable to modern browsers

इसके अलावा उल्लेखनीय, सर्विसपॉइंट मैनेजर.SecurityProtocols संपत्ति के लिए MSDN प्रलेख इस कथन को बनाता है:

.NET Framework 4.6 में एक नई सुरक्षा सुविधा शामिल है जो कनेक्शन के लिए असुरक्षित सिफर और हैशिंग एल्गोरिदम को ब्लॉक करती है।

जो बताता है कि SHA1 ब्लॉक के कुछ फार्म का स्थान हो सकता है।

मैं निम्नलिखित कोड का उपयोग कर रहा हूं और HttpRequestException अपवाद प्राप्त कर रहा हूं:

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.
    }
}

अपवाद:

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()

मैंने विंडोज प्रमाणपत्र स्टोर में एक ही प्रमाणपत्र निर्यात करने की कोशिश की और इसे Google क्रोम के माध्यम से उपयोग किया और यह ठीक काम करता है (ब्राउजर ने मुझे स्थापित प्रमाण पत्र की पुष्टि करने के लिए कहा और फिर संसाधन लोड किया)।

यह मेरे कोड में क्यों काम नहीं कर रहा है?

UPDATED

मैंने प्रमाण पत्र को मान्य करने के लिए कॉलबैक जोड़ने का भी प्रयास किया:

handler.ServerCertificateCustomValidationCallback = (message, certificate2, arg3, arg4) =>
{
    // I set a breakpoint to this point but it is not catched.
    return true;
};

UPDATED2

प्रमाणपत्र एसएचए-1 का उपयोग किया जाता है नील मॉस का उल्लेख उन टिप्पणियों में किया गया है जो SHA1 certs के समर्थन में वापस ले जा रहा है । अगर यह वास्तविक कारण है कि यह क्यों काम नहीं कर रहा है, तो इसके लिए वैकल्पिक समाधान है?

उपाय

समाधान के लिए नील मॉस का धन्यवाद उन्होंने एसएलएल प्रोटोकॉल के लिए टीएलएस ध्वज का उपयोग करने का प्रस्ताव रखा।

handler.SslProtocols = SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls;

लेकिन यह भी निम्नलिखित की आवश्यकता है:

handler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true;

मैंने इसे जोड़ा जाने के बाद ठीक काम किया।





x509certificate2