2017-12-20 134 views
18

के लिए कस्टम सर्टिफिकेट नहीं जोड़ रहा है मेरे पास निम्नलिखित सी # कोड है, जो एक कस्टम प्रमाणपत्र के साथ एक https कॉल का निर्माण करता है। टीएलएस 1.1 का उपयोग करते समय, कॉल ठीक काम करता है। टीएलएस 1.2 का उपयोग करते समय कॉल ब्रेक। मैं कर्ल का उपयोग कर, टीएलएस 1.2 का उपयोग कर ठीक काम करता है।सी # और डॉटनेट 4.7.1 टीएलएस 1.2 कॉल

सी # कोड:

X509Certificate2Collection collection = new X509Certificate2Collection(); 
collection.Import("C:\\SomePath\\MyCertificate.pfx", "MyPassword", X509KeyStorageFlags.PersistKeySet); 
var cert = collection[0]; 

ServicePointManager.SecurityProtocol = ...; 

ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, errors) => true; 
HttpClientHandler handler = new HttpClientHandler(); 
handler.ServerCertificateCustomValidationCallback = (message, certificate2, arg3, arg4) => true; 
handler.ClientCertificates.Add(cert); 

var content = new ByteArrayContent(Encoding.GetEncoding("latin1").GetBytes("Hello world")); 
HttpClient client = new HttpClient(handler); 
var resp = client.PostAsync(requestUri: url, content: content).Result.Content.ReadAsStringAsync().Result; 

वर्क्स के साथ:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11; 

त्रुटि के साथ:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 

नेट त्रुटि संदेश: SocketException: एक मौजूदा कनेक्शन जबरन द्वारा बंद कर दिया गया था रिमोट होस्ट

नेट संस्करण: 4.7.1

ओएस: विंडोज 10 संस्करण 1703 (समर्थित सिफर सूची: https://msdn.microsoft.com/en-us/library/windows/desktop/mt808163(v=vs.85).aspx) - और सर्वर को निर्दिष्ट TLS_RSA_WITH_AES_256_GCM_SHA384 प्रयोग की जाने वाली है, जो समर्थित सिफर में से है।

वायरसहार्क में मैं देख सकता हूं कि कामकाजी कॉल (सी #/टीएलएस 1.1 और कर्ल टीएलएस 1.2) के साथ प्रमाणपत्र सर्वर पर भेजा जा रहा है। यहाँ सी # TLS 1.1 कॉल के लिए wireshark डंप है:

Wireshark dump - Csharp tls 1.1

हालांकि, यह भी wireshark में, मुझे लगता है कि देख सकते हैं के साथ सी #/TLS 1.2 वहाँ कोई प्रमाण पत्र ग्राहक से सर्वर के लिए भेजा जा रहा है।

enter image description here

किसी को भी देख सकते हैं मैं यहाँ क्या याद आ रही है: यहाँ सी # TLS 1.2 कॉल के लिए wireshark डंप है?

अद्यतन

ऐसा लगता है प्रमाण पत्र एक md5 हस्ताक्षर जो TLS 1.2 के साथ संयोजन में खिड़कियों में Schannel द्वारा समर्थित नहीं है है। हमारे विक्रेता ने समाधान के रूप में हमें एक और प्रमाण पत्र बनाया है। https://community.qualys.com/thread/15498

+0

मुझे नेट कोर 2.0 क्लाइंट/सर्वर एप्लिकेशन के साथ समान समस्या थी। मैंने सर्वर पर टीएलएस 1.2 को मजबूर कर हल किया। इस तरह, ग्राहक प्रोटोकॉल और प्रमाणपत्र सही तरीके से बातचीत करते हैं। आप किसी ऐसे सर्वर से कनेक्ट करने का प्रयास कर सकते हैं जो केवल टीएलएस 1.2 के लिए मजबूर हो और देखें कि आपके पास .NET Framework के साथ समान व्यवहार है या नहीं। – Ghigo

+0

सर्वर पर इसे अच्छी तरह से बदलना वास्तव में एक विकल्प नहीं है क्योंकि सर्वर एक विक्रेता से संबंधित है। और इससे कोई फर्क नहीं पड़ता कि मैं टीएलएस 1.1 जोड़ता हूं। जब तक टीएलएस 1.2 स्वीकार्य प्रोटोकॉल में से एक है, तो यह समस्या होती है। मुझे यह जानने की ज़रूरत है कि क्यों .net इस तरह से व्यवहार करता है जब कर्ल ठीक काम करता है। और मुझे टीएलएस 1.2 सक्षम होना चाहिए क्योंकि यह एक स्थिर सेटिंग है और अन्य कनेक्शन उसी एप्लिकेशन में टीएलएस 1.2 पर निर्भर करते हैं। अगर मैं इस एकल कॉल के लिए टीएलएस 1.3 चालू कर सकता हूं, तो यह होगा। लेकिन हैंडलर ऑब्जेक्ट पर प्रोटोकॉल सेट करना एक अपवाद फेंकता है कि यह वर्तमान env में संभव नहीं है। –

+1

इस प्रश्न के डुप्लिकेट की तरह बहुत कुछ दिखता है https://stackoverflow.com/questions/44751179/tls-1-2-not-negotiated-in-net-4-7-without-explicit-servicepointmanager-security –

उत्तर

0

मेरा मानना ​​है कि इस कोड को हमेशा आँख बंद करके सही वापस लौट कर प्रमाणपत्र त्रुटि किसी प्रकार की मास्किंग है::

मैं सुझाव है कि आप एक समारोह है

मैं इस यादृच्छिक धागा कि इस मुद्दे पर चर्चा में आए वास्तव में arg4 के परिणामों का विश्लेषण करने के लिए। यह आपकी एसएसएल नीति त्रुटियां है। उन्हें लॉग इन करें और आपको अपना जवाब मिल जाएगा। मेरे उदाहरण में, मैं कंसोल पर लिखता हूं, लेकिन आप ट्रेस, या फ़ाइल पर लिख सकते हैं। आपको एक संख्या मिलेगी जो SslPolicyErrors गणना के लिए एक मूल्य से जुड़ा होगा। परिणामों के आधार पर आपको अपनी arg3 की जांच करने की आवश्यकता हो सकती है, जो आपकी श्रृंखला है।

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

SslPolicyErrors errs = sslPolicyErrors; 
Console.WriteLine("Policy Errors " + sslPolicyErrors.ToString());   
return true;}; 
+0

के रूप में गुजर रहा है, सबसे पहले, टिप्पणी के लिए धन्यवाद! हालांकि, कॉलबैक फ़ंक्शन कभी नहीं कहा जाता है। मैंने अभी ब्रेकपॉइंट और कंसोल लिखित कॉल के साथ फ़ंक्शन में एक बॉडी जोड़ा है और इनमें से कोई भी हिट नहीं हो जाता है। –

+0

Ctznkane वास्तव में, भले ही इसे टीएलएस 1.2 का उपयोग करते समय नहीं कहा जाता है, इसे वास्तव में टीएलएस 1.1 का उपयोग करते समय बुलाया जाता है और त्रुटि प्रकार "System.Net.Security.SslPolicyErrors.RemoteCertificateChainErrors" निर्दिष्ट करता है। विधि सही हो जाती है, कॉल को टीएलएस 1.1 में अनुमति देता है लेकिन हो सकता है कि टीएलएस 1.2 उच्च सुरक्षा मानकों के कारण इसे अनुमति न दे? मेरी सबसे अच्छी शर्त यह जानना है कि चेन त्रुटियां अब टीएलएस 1.1 के साथ क्यों होती हैं और फिर त्रुटि को ठीक करें और फिर से टीएलएस 1.2 के साथ प्रयास करें। मैं परिणाम के साथ वापस आऊंगा। –

+0

कॉलबैक विधि के लिए साबित वस्तुओं में थोड़ा खोदने के बाद, मुझे यह संदेश गहराई से मिला: "एक प्रमाण पत्र श्रृंखला संसाधित की गई, लेकिन रूट प्रमाणपत्र में समाप्त हो गया जो ट्रस्ट प्रदाता द्वारा भरोसा नहीं किया जाता है।" - मैं विशेष रूप से इस त्रुटि के लिए Google जाऊंगा। –

0

क्या आपको हैंडलर की SslProtocols संपत्ति निर्दिष्ट नहीं करना चाहिए?

कोशिश hander परिभाषा के बाद इस लाइन को जोड़ने:

handler.SslProtocols = SslProtocols.Tls12; 
1

आप इस समस्या के मूल कारण पर सही कर रहे हैं: डिफ़ॉल्ट रूप से, Schannel आधारित ग्राहकों SHA1, SHA256, SHA384 और SHA512 (Win10/सर्वर पर की पेशकश 2016)। इसलिए टीएलएस 1.2 सर्वर इन ग्राहकों को अपने एमडी 5 कर्ट भेजना नहीं चाहते हैं।

क्लाइंट (एचटीपी क्लाइंट) हस्ताक्षर_लगोरिदम एक्सटेंशन में MD5 सूचीबद्ध नहीं करता है, इसलिए टीएलएस 1.2 हैंडशेक विफल हो जाता है। फिक्स एक सुरक्षित सर्वर प्रमाण का उपयोग करना है।

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