2017-01-10 12 views
8

मैं सी # कोड लिखने की कोशिश कर रहा हूं जो एक वेब एप्लिकेशन के भीतर बिक्री कर की गणना के लिए उपयोग किए गए एक आरईएसटी सेवा एंडपॉइंट के खिलाफ वेब अनुरोध करता है। यह एक तृतीय पक्ष सेवा है, और यह एसएसएल का उपयोग कर सुरक्षित है। दो वातावरण, यूएटी और उत्पादन हैं। वेबरेक्वेस्ट चलाने वाला कोड इस तरह दिखता है:WebRequest त्रुटि - एसएसएल/टीएलएस सुरक्षित चैनल नहीं बना सका

... 

var req = WebRequest.Create(url) as HttpWebRequest; 
req.Method = "POST"; 
req.ContentType = "application/json"; 

... 

using (var webresponse = req.GetResponse()) 
{ 
    using (var responseStream = new StreamReader(webresponse.GetResponseStream())) 
    { 
     var respJson = responseStream.ReadToEnd(); 
     calcResult = BuildResponse(calcRequest, respJson, consoleWriteRawReqResponse); 
    } 
} 

return calcResult; 

यह यूएटी पर्यावरण के खिलाफ ठीक काम करता है। लेकिन जब मैं उत्पादन वातावरण के खिलाफ एक ही कोड चलाने के लिए, मैं त्रुटि मिलती है:

"एसएसएल नहीं बना सका/TLS सुरक्षित चैनल"

मैं बजे दोनों अनुरोधों के बिना, इस मुद्दे के बिना डाकिया से निष्पादित करने में सक्षम कोई विशेष संशोधन।

यह मैं नेतृत्व नीचे इस त्रुटि की जांच के रास्ते, और मैं कई उपयोगी अतः पदों विषय पर चर्चा, सहित पाया:

The request was aborted: Could not create SSL/TLS secure channel

Could not create SSL/TLS secure channel, despite setting ServerCertificateValidationCallback

ये मदद की मुझे सही में इंगित करके दिशा, जो ServicePointManager.SecurityProtocol सेटिंग को किसी भिन्न मान पर सेट करने और त्रुटियों की जांच करने के लिए ServicePointManager.ServerCertificateValidationCallback का उपयोग करने के लिए देखना था।

मैं इन के साथ खेलने के बाद क्या पाया निम्नलिखित है:

  • UAT पर्यावरण कॉल SSL3 की डिफ़ॉल्ट सेटिंग के साथ काम करेंगे | टीएलएस (.NET 4.5.2 के लिए डिफ़ॉल्ट), जबकि उत्पादन वातावरण नहीं होगा।
  • उत्पादन कॉल केवल तभी काम करेगा जब मैं इस सेटिंग को एसएसएल 3 पर स्पष्ट रूप से सेट करता हूं।

कि कोड इस तरह दिखता है:

... 

var req = WebRequest.Create(url) as HttpWebRequest; 
req.Method = "POST"; 
req.ContentType = "application/json"; 

... 

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; 
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CertValidationCallback); 
using (var webresponse = req.GetResponse()) 
{ 
    using (var responseStream = new StreamReader(webresponse.GetResponseStream())) 
    { 
     var respJson = responseStream.ReadToEnd(); 
     calcResult = BuildResponse(calcRequest, respJson, consoleWriteRawReqResponse); 
    } 
} 
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls; 

return calcResult; 

यह विशेष रूप से भ्रामक है क्योंकि एक वेब ब्राउज़र में अंतिम बिंदु को देख में, मैं देख सकता है कि वे दोनों एक ही वाइल्डकार्ड प्रमाणपत्र द्वारा सुरक्षित और दोनों कर रहे हैं टीएलएस 1.0 का उपयोग कर।

तो मुझे लगता है कि टीएलएस के लिए सेटिंग ServicePointManager.SecurityProtocol काम करेगा उम्मीद होती है, लेकिन ऐसा नहीं है।

मैं वास्तव में सर्विसपॉइंटमेनर सेट करने से बचाना चाहता हूं। सुरक्षा प्रोजेक्ट स्पष्ट रूप से SSL3 पर है क्योंकि हमारा एप्लिकेशन एक वेब एप्लिकेशन है और इसमें कई अन्य एकीकरण बिंदु हैं जो SSL पर संचार करते हैं। ये सभी कार्य ठीक हैं और मैं उनकी कार्यक्षमता पर प्रतिकूल प्रभावित करने के लिए नहीं करना चाहती। मैं सही कॉल करने से पहले यदि यह सेटिंग सेट, और फिर इसे वापस सही होने के बाद बदल यहां तक ​​कि अगर, मैं संगामिति मुद्दों से टकराने के बाद से ServicePointManager.SecurityProtocol स्थिर है के जोखिम को चलाते हैं।

मैं भी उस विषय की जांच की, और पसंद नहीं आया कि मैं क्या पढ़ा।कर रहे हैं विभिन्न एप्लिकेशन डोमेन का उपयोग का उल्लेख है:

.NET https requests with different security protocols across threads

How to use SSL3 instead of TLS in a particular HttpWebRequest?

लेकिन वह मेरे लिए बहुत जटिल/hacky लगता है। एक ऐप डोमेन वास्तव में एकमात्र समाधान बनाने के साथ काम कर रहा है? या यह ऐसा कुछ है जिसे मैं हल करने की कोशिश नहीं कर रहा हूं और इसके बजाय इसे सेवा के मालिक के साथ प्रश्न में ले जाना चाहिए? यह मेरे लिए बहुत उत्सुक है कि यह एक पर्यावरण/सर्वर पर टीएलएस के साथ काम करेगा, लेकिन दूसरे नहीं।

EDIT मैंने इसके साथ कुछ और खेलना शुरू किया। मैं (कोई दूसरा एप्लिकेशन डोमेन का उपयोग कर कोड है कि ServicePointManager.SecurityProtocol परिवर्तनों को अलग करने) दृष्टिकोण इस ब्लॉग पोस्ट में काफी अच्छी तरह से उल्लिखित उपयोग करने के लिए अपने ग्राहक को बदल दिया:

https://bitlush.com/blog/executing-code-in-a-separate-application-domain-using-c-sharp

यह वास्तव में बहुत अच्छी तरह से काम किया, और कर सकते थे वापस समाधान समाधान हो। लेकिन मैंने यह भी सीखा कि प्रश्न में सेवा के प्रदाता के पास एक अलग अंतराल (एक ही यूआरएल, अलग बंदरगाह) है जो टीएलएस 1.2 का उपयोग करके सुरक्षित है। शुक्र है, का विस्तार करके मेरी SecurityProtocol की तरह तो global.asax.cs आवेदन में घटना शुरू की स्थापना:

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

मैं सभी के वातावरण में सेवा ठीक के साथ संवाद करने में सक्षम हूँ। यह अन्य सेवाओं (साइबरसोर्स, उदाहरण के लिए) के साथ मेरे मौजूदा एकीकरण को भी प्रभावित नहीं करता है।

हालांकि - अब एक नया लेकिन संबंधित प्रश्न है। क्यों यह है कि यह कॉल केवल तभी काम करता है जब मैं सुरक्षाप्रोटोकॉल टाइप को ऊपर के रूप में विस्तारित करता हूं? साइबरसोर्स की तरह मेरे अन्य एकीकरण, इसकी आवश्यकता नहीं थी। फिर भी यह करता है। और वे सभी ब्राउज़र में जो देखा मैंने टीएलएस 1.2 का उपयोग करके सुरक्षित किया।

उत्तर

0

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

देख इन उन्नत टीएलएस सेटिंग में परिवर्तन करने के लिए, यह IIS में कुछ बटन पर क्लिक के रूप में सरल नहीं है। खैर यह है कि सरल किया जा सकता है अगर आप इस तरह एक तीसरी पार्टी उपकरण का उपयोग: https://www.nartac.com/Products/IISCrypto

ये विन्यास प्रमुख हाल वेब ब्राउज़र के लिए अच्छा काम है, लेकिन नेट (जब तक आप स्वयं चूक ओवरराइड इस तरह के आधुनिक सुरक्षित सर्वर विन्यास के साथ संघर्ष करने लगता है जैसा कि आपने पाया)।

निष्कर्ष: यह स्पष्ट नहीं है, आपके यूएटी और उत्पादन वातावरण समान प्रतीत होते हैं, लेकिन वे नहीं हैं।

+0

सबसे अच्छा तरीका है आपसे संपर्क करने के क्या है? आपके उत्तर के लिए आगे बढ़ रहा है। धन्यवाद – seoppc

0

आप 4.0 चलाते हैं तो आप इसे इस तरह उपयोग कर सकते हैं:

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; // SecurityProtocolType.Tls12 
संबंधित मुद्दे

 संबंधित मुद्दे