ServerCertificateValidationCallback सेट करने के बावजूद SSL / TLS सुरक्षित चैनल नहीं बना सका


85

मैं सर्वर पर स्व-हस्ताक्षरित प्रमाण पत्र के साथ एसएसएल / टीएलएस कनेक्शन स्थापित करने की कोशिश कर रहा हूं । असुरक्षित चैनल के माध्यम से संचार मुद्दों के बिना काम किया।

यहां मेरा नमूना कोड है, जिसे मैंने इस समाधान के आधार पर लिखा है: HttpClient C # के साथ बिना प्रमाणपत्र एसएसएल प्रमाणपत्रों की अनुमति देने से प्रमाणपत्र त्रुटियों को अनदेखा करें? .NET क्लाइंट ssl Web API से कनेक्ट हो रहा है

ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;

var c = new HttpClient();
var r = c.GetAsync("https://10.3.0.1:8443/rest/v1").Result;
if (r.IsSuccessStatusCode)
{
    Log.AddMessage(r.Content.Get<string>());
}
else
{
    Log.AddMessage(string.Format("{0} ({1})", (int)r.StatusCode, r.ReasonPhrase));
}

यह भी कोशिश की:

var handler = new WebRequestHandler();
handler.ServerCertificateValidationCallback = delegate { return true; };
var c = new HttpClient(handler);
...

और इस

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

लेकिन हर बार मुझे एक अपवाद मिला है:

InnerException: System.Net.Http.HttpRequestException
   _HResult=-2146233088
   _message=An error occurred while sending the request.
   HResult=-2146233088
   IsTransient=false
   Message=An error occurred while sending the request.
   InnerException: System.Net.WebException
        _HResult=-2146233079
        _message=The request was aborted: Could not create SSL/TLS secure channel.
        HResult=-2146233079
        IsTransient=false
        Message=The request was aborted: Could not create SSL/TLS secure channel.
        Source=System
        StackTrace:
             at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
             at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)
        InnerException: 

मुझसे क्या गलती हुई है? मैं इस सर्वर से कनेक्ट नहीं कर सकता (जिसके पास अमान्य-स्व-हस्ताक्षरित प्रमाणपत्र है)

जवाबों:


166

आप इसे ServerCertificateValidationCallback के साथ सही कर रहे हैं। यह वह समस्या नहीं है जिसका आप सामना कर रहे हैं। आप जिस समस्या का सामना कर रहे हैं, वह SSL / TLS प्रोटोकॉल का संस्करण है।

उदाहरण के लिए, यदि आपका सर्वर केवल SSLv3 और TLSv10 प्रदान करता है और आपके ग्राहक को TLSv12 की आवश्यकता है, तो आपको यह त्रुटि संदेश प्राप्त होगा। आपको यह सुनिश्चित करने की आवश्यकता है कि क्लाइंट और सर्वर दोनों के पास एक सामान्य प्रोटोकॉल संस्करण समर्थित है।

जब मुझे एक क्लाइंट की आवश्यकता होती है, जो अधिक से अधिक सर्वर से कनेक्ट करने में सक्षम होता है (बजाय जितना संभव हो उतना सुरक्षित) मैं इसका उपयोग करता हूं (साथ में सत्यापन कॉलबैक सेट करने के साथ):

  ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

1
मेरा भी वही मुद्दा है। POODLE-attack के कारण हम अपने सर्वर पर TLS 1.0 को बंद करने के लिए मजबूर हैं। जब मैं ऐसा करता हूं, तो एक तृतीय-पक्ष ऐप काम करना बंद कर देता है। असम्पीडित रूप से विघटित करना आपके समान एक कोड दिखाता है। यह GetAsync के बजाय webclientc.SendAsync का उपयोग करता है। यदि मैं परीक्षण के लिए कोड को एक कंसॉलिऐप में कॉपी करता हूं तो मैं त्रुटि को पुन: उत्पन्न कर सकता हूं, और ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 को जोड़कर यह काम करता है। मैंने सोचा कि सर्वर और क्लाइंट के बीच किसी तरह का हाथ मिलाना होगा, जिससे यह पता चले कि टीएलएस संस्करण का क्या उपयोग करना है? जब 1.0 अक्षम है तो यह स्वचालित रूप से 1.1 का चयन क्यों नहीं करता है?
एंगर्न

3
धन्यवाद! इसके साथ 3 घंटे संघर्ष कर रहा था। इस लाइन को जोड़ने से यह मेरे लिए हो गया:ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
थॉमस टी

1
ध्यान दें कि .NET के नए संस्करण को डिफ़ॉल्ट रूप से सक्षम किया गया है, हमें केवल .NET संस्करण को 4.6.1 पर सेट करना है
martinh_kentico

1
इसका मतलब बिल्कुल यही है, वैध या नहीं, आपको परवाह नहीं है। वह कॉलबैक आपको उस प्रमाणपत्र पर किसी भी सुरक्षा जांच से बचने की अनुमति देता है।
19:

1
महान जवाब, मुझे लगता है कि यह ServicePointManager.SecurityProtocolमान शायद डिफ़ॉल्ट होना चाहिए। या कम से कम फेंक दिया अपवाद के अंदर अधिक अंतर्दृष्टि होना चाहिए।
चाड

28

हम आज भी उसी समस्या को हल कर रहे हैं, और आपको केवल .NET के रनटाइम संस्करण को बढ़ाना है

4.5.2 ने उपरोक्त समस्या के साथ हमारे लिए काम नहीं किया , जबकि 4.6.1 ठीक था

यदि आपको .NET संस्करण रखने की आवश्यकता है, तो सेट करें

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

1
आपने कौन से वेरिएंट का उपयोग किया है और वास्तव में कैसे?
Martinh_kentico

1
मेरे पास .NET 4.5 अनुप्रयोग है जो आज से शुरू हो रहा है, एक विशिष्ट SSL साइट के साथ काम नहीं करेगा। अगर मैं 4.6.1 में बदलता हूं तो यह ठीक काम करता है, लेकिन मैं वास्तव में नहीं बदल सकता। मुझे यकीन नहीं है कि वहाँ क्या किया जाना है: |
स्यूरी

16

बस के रूप में किसी के लिए अभी भी इस में चल रहा है - मैं ServicePointManager.SecurityProfile विकल्पों को हल में बताए अनुसार जोड़ा गया है:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

और फिर भी मुझे वही मिलता रहा "अनुरोध निरस्त हो गया: एसएसएल / टीएलएस सुरक्षित चैनल नहीं बना सका" त्रुटि। मैं HTTPS SOAP एपीआई इंटरफेस (यानी वॉयस मेल, आईपी फोन सिस्टम आदि) के साथ कुछ पुराने वॉयस सर्वर से कनेक्ट करने का प्रयास कर रहा था। ये केवल SSL3 कनेक्शन का समर्थन करते हैं, क्योंकि वे पिछले साल अपडेट किए गए थे।

SSP3 को सुरक्षाप्रोटोकॉल की सूची में शामिल करने के बारे में सोचता है कि यहाँ चाल चलेंगे, लेकिन ऐसा नहीं हुआ। जिस तरह से मैं कनेक्शन को बाध्य कर सकता था वह केवल Ssl3 प्रोटोकॉल और अन्य को शामिल करने के लिए था:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

फिर कनेक्शन के माध्यम से चला जाता है - मेरे लिए एक बग की तरह लगता है, लेकिन यह त्रुटियों को फेंकना शुरू नहीं करता है जब तक कि मैं हाल ही में इन सर्वरों के लिए प्रदान नहीं करता हूं जो कि वर्षों से वहां से बाहर हैं - मुझे विश्वास है कि Microsoft ने सिस्टम परिवर्तनों को रोल आउट करना शुरू कर दिया है जिन्होंने इसे अपडेट किया है टीएलएस कनेक्शन को बाध्य करने के लिए व्यवहार जब तक कि कोई अन्य विकल्प न हो।

वैसे भी - यदि आप अभी भी कुछ पुरानी साइटों / सर्वरों के खिलाफ चल रहे हैं, तो यह कोशिश करने लायक है।


1
हमारे पास PowerShell के माध्यम से सिस्को यूनिफाइड कम्युनिकेशंस AXL एपीआई का उपयोग करने के लिए एक CUCMPowerShell मॉड्यूल है और आपके उत्तर ने हमें इसे जोड़कर ठीक करने में मदद की [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Ssl3। धन्यवाद! पूरा कोड इनवोक-CUCMSOAPAPIFunction
क्रिस मैग्नसन

2
@ जेफ़ - लिंक किए गए लेख को देखें। मुझे लगता है कि यह समझा सकता है कि Ssl3 ने काम क्यों नहीं किया और Ssl3 को फिर से सक्षम करने के दो तरीके सुझाए। docs.microsoft.com/en-us/dotnet/framework/migration-guide/…
स्कॉट

4

इस पंक्ति को आगे बढ़ाएँ: ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

इस पंक्ति से पहले: HttpWebRequest अनुरोध = (HttpWebRequest) WebRequest.Create (uri);

मूल पोस्ट: KB4344167 सुरक्षा अद्यतन TLS कोड को तोड़ता है


1
उपरोक्त सभी को बिना किसी लाभ के प्रयास करने के बाद, यह उत्तर था: HttpWebRequest बनाने से पहले ServicePointManager को सेट करने की आवश्यकता है।
हेनरी रुस्तड

2

मेरे मामले में TLS1_2 क्लाइंट और सर्वर दोनों पर सक्षम था लेकिन क्लाइंट ने इसे निष्क्रिय करते समय MD5 का उपयोग किया था। तो, http://ssllabs.com पर क्लाइंट और सर्वर दोनों का परीक्षण करें या क्या हो रहा है यह देखने के लिए Opensl / s_client का उपयोग करके परीक्षण करें। इसके अलावा, Wireshark का उपयोग करके चयनित सिफर की जाँच करें।


1

टीएलएस 1.0 और 1.1 अब जीवन का अंत हैं। हमारे अमेज़ॅन वेब सर्वर पर एक पैकेज अपडेट हुआ और हमें यह त्रुटि मिलने लगी।

जवाब ऊपर है, लेकिन आपको उपयोग नहीं करना चाहिए tlsयाtls11 अब नहीं।

विशेष रूप से ASP.Net के लिए, इसे अपने एक स्टार्टअप तरीके से जोड़ें।

        public Startup()
        {
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12;

लेकिन मुझे यकीन है कि ऐसा कुछ अन्य कई मामलों में काम करेगा।


0

यदि आप एक नए डोमेन नाम का उपयोग कर रहे हैं, और आपने उपरोक्त सभी कार्य किए हैं और आपको अभी भी वही त्रुटि मिल रही है, तो यह देखने के लिए जांचें कि क्या आप अपने पीसी पर DNS कैश को साफ़ करते हैं। अपना DNS साफ़ करेंअधिक विवरण के लिए को ।

विंडोज® 8

यदि आप Windows 8 का उपयोग करते हैं तो अपने DNS कैश को खाली करने के लिए, निम्न चरणों का पालन करें:

अपने कीबोर्ड पर, WinX मेनू खोलने के लिए Win + X दबाएं।

कमांड प्रॉम्प्ट को राइट-क्लिक करें और एडमिनिस्ट्रेटर के रूप में रन चुनें।

निम्न आदेश चलाएँ:

ipconfig / flushdns

यदि आदेश सफल होता है, तो सिस्टम निम्न संदेश लौटाता है:

Windows IP कॉन्फ़िगरेशन ने DNS रिज़ॉल्वर कैश को सफलतापूर्वक निकाल दिया।

विंडोज® 7

यदि आप Windows 7 का उपयोग करते हैं, तो अपने DNS कैश को खाली करने के लिए, निम्न चरणों का पालन करें:

प्रारंभ पर क्लिक करें।

प्रारंभ मेनू खोज पाठ बॉक्स में cmd ​​दर्ज करें।

कमांड प्रॉम्प्ट को राइट-क्लिक करें और एडमिनिस्ट्रेटर के रूप में रन चुनें।

निम्न आदेश चलाएँ:

ipconfig / flushdns

यदि आदेश सफल होता है, तो सिस्टम निम्न संदेश लौटाता है: Windows IP कॉन्फ़िगरेशन ने DNS रिज़ॉल्वर कैश को सफलतापूर्वक निकाल दिया।


ipconfig /flushdnsC # में?
किकेनेट

0

मैं इस थ्रेड के पार आया क्योंकि मेरे पास भी त्रुटि थी SSL / TLS सुरक्षित चैनल नहीं बना सका। मेरे मामले में, मैं PowerShell का उपयोग करके एक सीबेल कॉन्फ़िगरेशन रीस्ट एपीआई तक पहुंचने का प्रयास कर रहा था Invoke-RestMethod, और ऊपर दिए गए किसी भी सुझाव ने मदद नहीं की।

आखिरकार मैं अपनी समस्या के कारण से ठोकर खा गया: सर्वर मैं आवश्यक क्लाइंट प्रमाणपत्र प्रमाणीकरण से संपर्क कर रहा था।

कॉल को काम करने के लिए, मुझे -Certificateपैरामीटर के साथ ग्राहक प्रमाणपत्र (निजी कुंजी सहित) प्रदान करना था :

$Pwd = 'certificatepassword'
$Pfx = New-Object -TypeName 'System.Security.Cryptography.X509Certificates.X509Certificate2'
$Pfx.Import('clientcert.p12', $Pwd, 'Exportable,PersistKeySet')
Invoke-RestMethod -Uri 'https://your.rest.host/api/' -Certificate $Pfx -OtherParam ...

उम्मीद है कि मेरा अनुभव किसी और की मदद कर सकता है, जिसे इस समस्या का कोई विशेष स्वाद है।

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