प्रमाणीकरण विफल हो गया क्योंकि दूरस्थ पार्टी ने परिवहन स्ट्रीम को बंद कर दिया है


87

मैं प्रमाण पत्र प्रमाणीकरण के साथ ओपनएसएसएल सर्वर को जोड़ने के लिए एक टीसीपी क्लाइंट विकसित कर रहा हूं। मेरे पास .crt और .key फ़ाइलों का उपयोग सर्वर टीम द्वारा साझा किया गया है। ये प्रमाण पत्र ओपनएसएसएल कमांड द्वारा उत्पन्न किए जाते हैं।

मैं SslStreamTcp क्लाइंट को SslStream.AuthenticateAsClientसर्वर पास करके विधि को प्रमाणित करने के लिए ऑब्जेक्ट का उपयोग कर रहा हूं IP, SslProtocols.Ssl3और X509CertificateCollection

मुझे निम्नलिखित त्रुटि प्राप्त हो रही है:

प्रमाणीकरण विफल हो गया क्योंकि दूरस्थ पार्टी ने परिवहन स्ट्रीम को बंद कर दिया है


2
यह POODLE के दिनों में एक समस्या की तरह दिखता है SslProtocols.Ssl3:। शायद आपको कोशिश करनी चाहिए SslProtocols.Tls। .Net 4.5 और इसके बाद के संस्करण में, आप भी उपयोग कर सकते हैं Tls11या Tls12SslProtocols गणना देखें । आपको अन्य समस्याएं हो सकती हैं।
jww


धन्यवाद। मेरी समस्या हल हो गई है प्रमाण पत्र के भौतिक पथ से प्रमाण पत्र संलग्न करके और प्रमाण पत्र विषय नाम खोजने के बजाय विंडोज़ प्रमाण पत्र की दुकान से।
ओडेलु

अब मैं सभी SslProtocols (SSL3, Tls1 और Tls2) से परिणाम प्राप्त करने में सक्षम हूं। उत्तर के लिए धन्यवाद
Odelu

@Oelu, आपने समस्या को कैसे ठीक किया? क्लाइंट की तरफ या सर्वर की तरफ?

जवाबों:


155

मैं सिक्योरिटीप्रोटोकॉल को टीएलएस 1.1 में प्रतिबंधित करने की सलाह दूंगा।

उपयोग करने के लिए अनुशंसित समाधान है

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls

एक अन्य विकल्प निम्नलिखित रजिस्ट्री कुंजी जोड़ रहा है:

Key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 
Value: SchUseStrongCrypto 

यह ध्यान देने योग्य है कि .NET 4.6 डिफ़ॉल्ट रूप से सही प्रोटोकॉल का उपयोग करेगा और इसके समाधान की आवश्यकता नहीं है।


6
वाह, आपने मेरी समस्या का हल निकाल लिया - मैं हर तरह की कोशिश कर रहा था - और फिर फ्रेम पर नोट देखकर यहाँ समाप्त हुआ। बस इसे 4.6.1 पर स्विच किया गया था (4.5 का उपयोग कर रहा था), उम्मीद है कि समस्या होगी गलत सुरक्षा प्रोटोकॉल का उपयोग करते हुए फ्रेमवर्क हो सकता है - और बिंगो, मेरे कनेक्शन से इनकार नहीं किया जा रहा है, और मुझे मेरा डेटा मिल रहा है!
विवेके

7
यह कहना महत्वपूर्ण है कि System.Net.ServicePointManager.SecurityProtocol = ...अनुरोध बनाने से पहले निष्पादित किया जाना चाहिए।
टन अनुपात

2
4.6.1 को उस टारगेट फ्रेमवर्क वर्जन अपडेट ने मेरी जान बचाई :-)
Awais

मेरा ढांचा 4.6.2 पर सेट है। हो सकता है कि मुझे इसके बजाय TLS समाधान का उपयोग करना होगा
Luminous

मैं 4.7.2 फ्रेमवर्क का उपयोग कर रहा हूं, जिस साइट पर मैं अनुरोध भेज रहा हूं वह टीएलएस 1.2 का उपयोग कर रहा है, लेकिन 10 में से 6 अनुरोधों की तरह मुझे यह त्रुटि मिलती है। कोई विचार ?
डेविट मिकुचाडेज़

16

यदि आप .net के पुराने संस्करण का उपयोग करना चाहते हैं, तो अपना स्वयं का ध्वज बनाएं और उसे कास्ट करें।

    //
    // Summary:
    //     Specifies the security protocols that are supported by the Schannel security
    //     package.
    [Flags]
    private enum MySecurityProtocolType
    {
        //
        // Summary:
        //     Specifies the Secure Socket Layer (SSL) 3.0 security protocol.
        Ssl3 = 48,
        //
        // Summary:
        //     Specifies the Transport Layer Security (TLS) 1.0 security protocol.
        Tls = 192,
        //
        // Summary:
        //     Specifies the Transport Layer Security (TLS) 1.1 security protocol.
        Tls11 = 768,
        //
        // Summary:
        //     Specifies the Transport Layer Security (TLS) 1.2 security protocol.
        Tls12 = 3072
    }
    public Session()
    {
        System.Net.ServicePointManager.SecurityProtocol = (SecurityProtocolType)(MySecurityProtocolType.Tls12 | MySecurityProtocolType.Tls11 | MySecurityProtocolType.Tls);
    }

1
आपको अपनी स्वयं की कक्षा का उपयोग करने की आवश्यकता नहीं है, आप सीधे पूर्णांक को SecurityProtocolTypeServicePointManager.SecurityProtocol = (SecurityProtocolType) 48 | (SecurityProtocolType) 192 | (SecurityProtocolType) 768 | (SecurityProtocolType) 3072;
Yan F.

13

नीचे दिए गए कोड को जोड़ने से मुझे इस मुद्दे पर काबू पाने में मदद मिली।

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11;

8
using (var client = new HttpClient(handler))
            {
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
                var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, apiEndPoint)).ConfigureAwait(false);
                await response.Content.ReadAsStringAsync().ConfigureAwait(false);
            }

इसने मेरे लिए काम किया


1
महत्वपूर्ण बिट निम्न पंक्ति है: ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; यह उत्तर बहुत अच्छा है क्योंकि यह दर्शाता है कि उस लाइन को विशिष्ट उपयोग के मामले में कहां फिट होना चाहिए।
निक पेंटर

5

मैं ChargifyNET.dll का उपयोग करते हुए Chargify API के साथ संवाद करने के दौरान एक ही त्रुटि संदेश में भाग गया। chargify.ProtocolType = SecurityProtocolType.Tls12;कॉन्फ़िगरेशन में जोड़ने से मेरे लिए समस्या हल हो गई।

यहाँ पूरा कोड स्निपेट है:

public ChargifyConnect GetChargifyConnect()
{
    var chargify = new ChargifyConnect();
    chargify.apiKey = ConfigurationManager.AppSettings["Chargify.apiKey"];
    chargify.Password = ConfigurationManager.AppSettings["Chargify.apiPassword"];
    chargify.URL = ConfigurationManager.AppSettings["Chargify.url"];

    // Without this an error will be thrown.
    chargify.ProtocolType = SecurityProtocolType.Tls12;

    return chargify;
}

2

VB.NET के लिए, आप अपने वेब अनुरोध से पहले निम्नलिखित जगह कर सकते हैं:

Const _Tls12 As SslProtocols = DirectCast(&HC00, SslProtocols)
Const Tls12 As SecurityProtocolType = DirectCast(_Tls12, SecurityProtocolType)
ServicePointManager.SecurityProtocol = Tls12

इससे .NET 3.5 पर मेरी सुरक्षा समस्या हल हो गई।


0

यह मेरे साथ तब हुआ जब एक वेब अनुरोध समापन बिंदु को किसी अन्य सर्वर पर स्विच किया गया था जो केवल TLS1.2 अनुरोध स्वीकार करता है। इतने सारे प्रयासों की कोशिश की जो ज्यादातर स्टैकओवरफ्लो पर पाए गए जैसे

  1. रजिस्ट्री कुंजी,
  2. जोड़ा गया:
    System.Net.ServicePointManager.SecurityProtocol | = System.Net.SecurityProtocolType.Tls12; to Global.ASX OnStart,
  3. Web.config में जोड़ा गया।
  4. 4.7.2 अपडेट किया गया। अभी भी एक ही अपवाद हो रहा है।

प्राप्त अपवाद से मुझे वास्तविक समस्या का न्याय नहीं हुआ और मुझे सेवा संचालक से कोई मदद नहीं मिली।

इसे सुलझाने के लिए मैं एक नया सिफ़र सुइट जोड़ने के लिए TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 से आईआईएस क्रिप्टो 2.0 उपकरण का इस्तेमाल किया है मैं यहाँ के रूप में नीचे दिखाया गया है।

यहाँ छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.