दिलचस्प पोस्ट
स्विफ्ट और ऑब्जेक्टिव-सी के बीच साझा किए गए किसी प्रोटोकॉल के अनुरूप वर्ग विधियों को कैसे बनायें? एंड्रॉइड वेबव्यू -> वेबएर्चिव प्रदर्शित करें स्ट्रिंग इंडेक्स सीधा अपवाद जावा से बाहर बटन प्रेस पर UITableView सेल की पंक्ति हो रही है NTFS प्रदर्शन और फ़ाइलों और निर्देशिकाओं की बड़ी मात्रा Php कर्ल का इस्तेमाल करते हुए webservice को XML सेवा भेजें Levenshtein दूरी की गणना करने के लिए सबसे कारगर तरीका AngularJS और कॉलिंग एमवीसी एपीआई का उपयोग कर फ़ाइल कैसे डाउनलोड करें? गतिशील रूप से बाहरी जावास्क्रिप्ट फ़ाइल लोड करें, और इसे लोड करने के लिए प्रतीक्षा करें – JQuery का उपयोग किए बिना मैं मोंगोज़ में कोई दस्तावेज़ कैसे अपडेट / अपग्रेड कर सकता हूं? कैसे सी + + अपवाद हैंडलिंग रनटाइम लागू है? पृष्ठ लोड हो रहा है, जबकि एजीक्स लोड हो रहा है gif एनीमेशन दिखाने के लिए कैसे? फोरट्रान में दो-आयामी arrays को कैसे प्रारंभ करें SQL सर्वर में रिकर्सिव क्वेरी एक MySQL तालिका में डालें या अपडेट करें

.NET के HttpWebRequest / Response के साथ एक स्व-हस्ताक्षरित प्रमाणपत्र का उपयोग करना

मैं एक एपीआई से कनेक्ट करने का प्रयास कर रहा हूं जो स्वयं-हस्ताक्षरित SSL प्रमाणपत्र का उपयोग करता है। मैं ऐसा कर रहा हूँ। NET के HttpWebRequest और HttpWebResponse वस्तुओं का उपयोग कर और मुझे एक अपवाद मिल रहा है कि:

अंतर्निहित कनेक्शन बंद कर दिया गया था: SSL / TLS सुरक्षित चैनल के लिए विश्वास संबंध स्थापित नहीं किया जा सका।

मैं समझता हूं कि इसका क्या मतलब है। और मैं समझता हूं कि क्यों .नेट का मानना ​​है कि मुझे चेतावनी देना चाहिए और कनेक्शन बंद करना चाहिए। लेकिन इस मामले में, मैं बस एपीआई से जुड़ना चाहूंगा, फिर भी, मानव-इन-द-मध्य आक्रमणों को तबाह किया जायेगा।

तो, मैं इस स्व-हस्ताक्षरित प्रमाण पत्र के लिए एक अपवाद जोड़ने के बारे में कैसे जाना चाहूंगा? या HttpWebRequest / प्रतिक्रिया को प्रमाणित करने के लिए बिल्कुल भी प्रमाणित नहीं करने का दृष्टिकोण है? मुझे यह कैसे करना है?

Solutions Collecting From Web of ".NET के HttpWebRequest / Response के साथ एक स्व-हस्ताक्षरित प्रमाणपत्र का उपयोग करना"

@डॉम्स्टर: वह काम करता है, लेकिन हो सकता है कि आप जाँच कर रहे हैं कि क्या प्रमाण पत्र हैश आपकी अपेक्षाओं से मेल खाता है या नहीं। इसलिए एक विस्तारित संस्करण कुछ इस तरह दिखता है (कुछ लाइव कोड के आधार पर हम उपयोग कर रहे हैं):

static readonly byte[] apiCertHash = { 0xZZ, 0xYY, ....}; /// <summary> /// Somewhere in your application's startup/init sequence... /// </summary> void InitPhase() { // Override automatic validation of SSL server certificates. ServicePointManager.ServerCertificateValidationCallback = ValidateServerCertficate; } /// <summary> /// Validates the SSL server certificate. /// </summary> /// <param name="sender">An object that contains state information for this /// validation.</param> /// <param name="cert">The certificate used to authenticate the remote party.</param> /// <param name="chain">The chain of certificate authorities associated with the /// remote certificate.</param> /// <param name="sslPolicyErrors">One or more errors associated with the remote /// certificate.</param> /// <returns>Returns a boolean value that determines whether the specified /// certificate is accepted for authentication; true to accept or false to /// reject.</returns> private static bool ValidateServerCertficate( object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors sslPolicyErrors) { if (sslPolicyErrors == SslPolicyErrors.None) { // Good certificate. return true; } log.DebugFormat("SSL certificate error: {0}", sslPolicyErrors); bool certMatch = false; // Assume failure byte[] certHash = cert.GetCertHash(); if (certHash.Length == apiCertHash.Length) { certMatch = true; // Now assume success. for (int idx = 0; idx < certHash.Length; idx++) { if (certHash[idx] != apiCertHash[idx]) { certMatch = false; // No match break; } } } // Return true => allow unauthenticated server, // false => disallow unauthenticated server. return certMatch; } 

बाहर निकल जाता है, यदि आप केवल प्रमाणपत्र सत्यापन पूरी तरह अक्षम करना चाहते हैं, तो आप ServicePointManager पर ServerCertificateValidationCallback को बदल सकते हैं, जैसे:

 ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

यह सभी प्रमाण-पत्रों को मान्य करेगा (अवैध, समाप्त हो चुके या स्वयं-हस्ताक्षर वाले सहित)

स्थानीय कंप्यूटर विश्वसनीय रूट प्रमाणन प्राधिकरणों को स्व हस्ताक्षरित प्रमाणपत्र जोड़ें

आप एमएमसी प्रशासक के रूप में चलाने के द्वारा प्रमाणित आयात कर सकते हैं।

कैसे करें: एमएमसी स्नैप-इन के साथ प्रमाण-पत्र देखें

ध्यान दें, कि .NET 4.5 में आप खुद एचटीटीपी वेबबेट के लिए SSL सत्यापन को ओवरराइड कर सकते हैं (और वैश्विक प्रतिनिधि द्वारा जो सभी अनुरोधों को प्रभावित करता है):

http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.servercertificatevalidationcallback.aspx

 HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri); request.ServerCertificateValidationCallback = delegate { return true; }; 

Domster के जवाब में उपयोग किए गए सत्यापन कॉलबैक का दायरा एक विशिष्ट अनुरोध के लिए सीमित हो सकता है, जिस पर प्रेषक पैरामीटर ServerCertificateValidationCallback प्रतिनिधि का उपयोग करता है। निम्नलिखित सरल दायरे वर्ग इस तकनीक का उपयोग अस्थायी रूप से एक सत्यापन कॉलबैक को तार करने के लिए करता है जो केवल दिए गए अनुरोध ऑब्जेक्ट के लिए कार्यान्वित करता है।

 public class ServerCertificateValidationScope : IDisposable { private readonly RemoteCertificateValidationCallback _callback; public ServerCertificateValidationScope(object request, RemoteCertificateValidationCallback callback) { var previous = ServicePointManager.ServerCertificateValidationCallback; _callback = (sender, certificate, chain, errors) => { if (sender == request) { return callback(sender, certificate, chain, errors); } if (previous != null) { return previous(sender, certificate, chain, errors); } return errors == SslPolicyErrors.None; }; ServicePointManager.ServerCertificateValidationCallback += _callback; } public void Dispose() { ServicePointManager.ServerCertificateValidationCallback -= _callback; } } 

निम्न प्रकार के विशिष्ट अनुरोध के लिए सभी प्रमाणपत्र त्रुटियों को अनदेखा करने के लिए उपरोक्त वर्ग का उपयोग किया जा सकता है:

 var request = WebRequest.Create(uri); using (new ServerCertificateValidationScope(request, delegate { return true; })) { request.GetResponse(); } 

किसी और के लिए संभव मदद के रूप में जोड़ने के लिए … यदि आप चाहते हैं कि उपयोगकर्ता को स्वयं-हस्ताक्षरित प्रमाणपत्र स्थापित करने के लिए संकेत मिलता है, तो आप इस कोड (ऊपर से संशोधित) का उपयोग कर सकते हैं।

व्यवस्थापक अधिकारों की आवश्यकता नहीं है, स्थानीय उपयोगकर्ताओं को विश्वस्त प्रोफाइल स्थापित करता है:

  private static bool ValidateServerCertficate( object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors sslPolicyErrors) { if (sslPolicyErrors == SslPolicyErrors.None) { // Good certificate. return true; } Common.Helpers.Logger.Log.Error(string.Format("SSL certificate error: {0}", sslPolicyErrors)); try { using (X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser)) { store.Open(OpenFlags.ReadWrite); store.Add(new X509Certificate2(cert)); store.Close(); } return true; } catch (Exception ex) { Common.Helpers.Logger.Log.Error(string.Format("SSL certificate add Error: {0}", ex.Message)); } return false; } 

यह हमारे आवेदन के लिए अच्छी तरह से काम करता है, और यदि उपयोगकर्ता प्रेस नहीं करता है, तो संचार कार्य नहीं करेगा।

अपडेट: 2015-12-11 – बदले गए स्टोर नाम.रूट करें स्टोरनाम के लिए.मेरा – रूट की जगह मेरा स्थानीय उपयोगकर्ता स्टोर में स्थापित होगा। कुछ सिस्टम पर रूट काम नहीं करेगा, भले ही आप "व्यवस्थापक के रूप में चलाएं"

बस devstuff से जवाब पर निर्माण विषय और जारीकर्ता शामिल करने के लिए … टिप्पणियाँ स्वागत है …

 public class SelfSignedCertificateValidator { private class CertificateAttributes { public string Subject { get; private set; } public string Issuer { get; private set; } public string Thumbprint { get; private set; } public CertificateAttributes(string subject, string issuer, string thumbprint) { Subject = subject; Issuer = issuer; Thumbprint = thumbprint.Trim( new char[] { '\u200e', '\u200f' } // strip any lrt and rlt markers from copy/paste ); } public bool IsMatch(X509Certificate cert) { bool subjectMatches = Subject.Replace(" ", "").Equals(cert.Subject.Replace(" ", ""), StringComparison.InvariantCulture); bool issuerMatches = Issuer.Replace(" ", "").Equals(cert.Issuer.Replace(" ", ""), StringComparison.InvariantCulture); bool thumbprintMatches = Thumbprint == String.Join(" ", cert.GetCertHash().Select(h => h.ToString("x2"))); return subjectMatches && issuerMatches && thumbprintMatches; } } private readonly List<CertificateAttributes> __knownSelfSignedCertificates = new List<CertificateAttributes> { new CertificateAttributes( // can paste values from "view cert" dialog "CN = subject.company.int", "CN = issuer.company.int", "f6 23 16 3d 5a d8 e5 1e 13 58 85 0a 34 9f d6 d3 c8 23 a8 f4") }; private static bool __createdSingleton = false; public SelfSignedCertificateValidator() { lock (this) { if (__createdSingleton) throw new Exception("Only a single instance can be instanciated."); // Hook in validation of SSL server certificates. ServicePointManager.ServerCertificateValidationCallback += ValidateServerCertficate; __createdSingleton = true; } } /// <summary> /// Validates the SSL server certificate. /// </summary> /// <param name="sender">An object that contains state information for this /// validation.</param> /// <param name="cert">The certificate used to authenticate the remote party.</param> /// <param name="chain">The chain of certificate authorities associated with the /// remote certificate.</param> /// <param name="sslPolicyErrors">One or more errors associated with the remote /// certificate.</param> /// <returns>Returns a boolean value that determines whether the specified /// certificate is accepted for authentication; true to accept or false to /// reject.</returns> private bool ValidateServerCertficate( object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors sslPolicyErrors) { if (sslPolicyErrors == SslPolicyErrors.None) return true; // Good certificate. Dbg.WriteLine("SSL certificate error: {0}", sslPolicyErrors); return __knownSelfSignedCertificates.Any(c => c.IsMatch(cert)); } } 

ध्यान रखना एक बात यह है कि ServicePointManager.ServerCertificateValidationCallback होने का मतलब यह नहीं लगता है कि सीआरएल चेक और सर्वरनाम सत्यापन नहीं किया गया है, यह केवल उनके परिणाम को ओवरराइड करने के लिए एक साधन प्रदान करता है। इसलिए आपकी सेवा को अब भी सीआरएल प्राप्त करने में थोड़ी देर लग सकती है, आप केवल बाद में जान पाएंगे कि यह कुछ जांचों में विफल रहा है।

मैं ओपी के समान समस्या में चल रहा था जहां वेब अनुरोध उस सटीक अपवाद को फेंक दिया गया था। मैं सब कुछ सेटअप सही ढंग से मैंने सोचा, प्रमाण पत्र स्थापित किया गया था, मैं मशीन की दुकान में इसे ठीक से देख सकता है ठीक है और यह वेब अनुरोध को संलग्न करता है, और मैंने अनुरोध के संदर्भ में प्रमाण पत्र का सत्यापन अक्षम कर दिया था।

यह पता चला कि मैं अपने उपयोगकर्ता खाते के तहत चल रहा था, और यह प्रमाण पत्र मशीन की दुकान में स्थापित किया गया था। इससे वेब अपवाद को यह अपवाद फेंकने का कारण हो गया। समस्या को हल करने के लिए मुझे या तो प्रशासक के रूप में चलाने या प्रमाण पत्र को उपयोगकर्ता के स्टोर में स्थापित करना था और वहां से इसे पढ़ना था।

ऐसा प्रतीत होता है कि सी # मशीन की दुकान में प्रमाण पत्र प्राप्त करने में सक्षम है, भले ही इसे वेब अनुरोध के साथ प्रयोग न किया जा सके, और यह कि वेब अनुरोध जारी होने के बाद ओपी के अपवाद में फेंक दिया जा सकता है।