2010-06-23 16 views
7

दूरस्थ वेब सर्वर पर HTTPS अनुरोध करते समय, मैं WebRequest का उपयोग करता हूं, जो दूरस्थ वेब सर्वर के साथ सुरक्षित कनेक्शन स्थापित करता है। विकास के दौरान, मैं सर्वर पर स्वयं हस्ताक्षरित प्रमाण का उपयोग करता हूं, और WebRequest सुरक्षित कनेक्शन स्थापित करने में विफल रहता है, क्योंकि प्रमाण मान्य नहीं है, जो व्यवहार की अपेक्षा की जाती है।HTTPS अनुरोध के दौरान दूरस्थ SSL प्रमाणपत्र सत्यापित करें

मुझे यह कोड मिला है जो कोड को "रिमोट्स" चेक चेक मिला है, निम्नलिखित कोड में SetCertificatePolicy() विधि को कॉल करके सक्रिय किया गया है।

public static void SetCertificatePolicy() 
{ 
    ServicePointManager.ServerCertificateValidationCallback 
       += RemoteCertificateValidate; 
} 

/// <summary> 
/// Remotes the certificate validate. 
/// </summary> 
private static bool RemoteCertificateValidate(
    object sender, X509Certificate cert, 
    X509Chain chain, SslPolicyErrors error) 
{ 
    // trust any certificate!!! 
    System.Console.WriteLine("Warning, trust any certificate"); 
    return true; 
} 

मैं सोच रहा हूँ, अगर यह रिमोट एसएसएल प्रमाणपत्र पर विशेष जांच कर के लिए संभव है (कोड ऊपर का उपयोग कर, उदाहरण के लिए) है, ताकि इस बात की पुष्टि कर सकते हैं कि दूरदराज के वेब सर्वर मान्य SSL प्रमाणपत्र का उपयोग करता है, और नहीं बस किसी भी वैध प्रमाण, लेकिन वास्तव में मैं चाहता हूँ? उदाहरण के लिए, मैं यह सुनिश्चित करना चाहता हूं कि मैं www.someplace.com वेबसाइट से बात कर रहा हूं, एसीएमई इंक को जारी प्रमाण पत्र, फिंगरप्रिंट 00:11:22: .....

"सर्वोत्तम अभ्यास क्या है "इस परिदृश्य के लिए दृष्टिकोण?

धन्यवाद!

उत्तर

7

यदि आप वास्तव में इसे एक विशेष प्रमाणपत्र में ले जाना चाहते हैं, तो आप certificate.GetRawCertData() में byte[] पर प्रमाणपत्र डेटा (डीईआर प्रारूप में) की तुलना कर सकते हैं।

तुम भी RemoteCertificateValidate में certificate पैरामीटर पर GetCertHashString() और Subject का उपयोग जानकारी आप के बाद कर रहे हैं पाने के लिए कर सकते हैं। होस्टनाम को विषय के वैकल्पिक वैकल्पिक नाम में होना चाहिए या यदि विषय के विशिष्ट सीएन (विशिष्ट) नाम में कोई विषय वैकल्पिक नाम नहीं है। जिस तरह से .NET विषय स्ट्रिंग को प्रारूपित करता है, यह पहला सीएन = आपको वहां मिलना चाहिए।

certificateX509Certificate2 का उदाहरण है तो आपको अधिक डेटा भी मिलेगा। इसके बाद आप SubjectName को X500PrincipalName और Extensions (विषय वैकल्पिक नाम एक्सटेंशन की जांच करने के लिए) प्राप्त करने में सक्षम होंगे। विषय नाम को पार्स करने के लिए बाउंसीकास्टल जैसे टूल का उपयोग करना उपयोगी हो सकता है।

आपको अपने रनटाइम प्रकार के आधार पर sender में उस होस्टनाम के बारे में अधिक जानकारी मिलने की संभावना है, जिसे आप संपर्क करने का प्रयास कर रहे हैं।

+0

धन्यवाद, यही वह था जो मैं ढूंढ रहा था। बस एक त्वरित क्यू, पहले संकेत के बारे में (बाइट [] पर प्रमाण डेटा की तुलना करना) - क्या मुझे ज्ञात वैध प्रमाण के बाइट सरणी की तुलना करने की आवश्यकता है जिसे मैं सत्यापित कर रहा हूं? –

+0

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

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