2009-07-27 13 views
5

पर मान्य करने के लिए क्या मैं उपयोगकर्ताओं को अपने सर्वर के लिए वास्तविक कर्ट बनाने के लिए नहीं मिल सकता लेकिन मैं कुछ सुरक्षा जांच करना चाहता हूं। तो निम्नलिखित बहुत हल्का है क्योंकि, जैसा कि मैंने इसे पढ़ा है, वहां नहीं कर्ट पर जांच कर रहा है।नेट प्रोग्रामिंग: एसएसएल स्व-हस्ताक्षरित प्रमाणपत्र

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

क्या आप सलाह देते हैं कि मेरे पास x509 प्रमाणपत्र पर ग्राहक जांचें? यह देखते हुए कि मैं एक .NET भाषा का उपयोग कर रहा हूं (सी #/एफ #)।

उत्तर

4

यदि आप क्लाइंट को वास्तविक कार्ट बनाने के लिए नहीं मिल पा रहे हैं तो आपको कम से कम अपने सर्वर का उपयोग करके उन्हें कर्ट बनाने की कोशिश करनी चाहिए। फिर आप जांच सकते हैं कि प्रमाणपत्र वैध है या कम से कम आपके सीए से है क्योंकि आपको पता चलेगा कि आपके सीए से समझौता किया गया है या नहीं। यदि आप किसी भी और सभी सीए पर भरोसा कर रहे हैं तो वास्तव में जांच के लायक कुछ भी नहीं है।

+0

+1 पूरी तरह सहमत हूँ में अपने स्वयं के सत्यापन तर्क डाल सकता है। जब तक आप जारी करने वाले सीए पर भरोसा नहीं कर सकते, तब तक शेष प्रमाणपत्र बहुत अधिक अर्थहीन नहीं है। यदि आप * वास्तविक * कर्ट का उपयोग नहीं कर सकते हैं, तो स्पेंसर कहता है, देखें कि क्या आप अपना स्वयं का सीए सेट कर सकते हैं (या पहले से ही) है कि आप वहां से अपने उपयोगकर्ताओं को कर्ट्स पर भरोसा कर सकते हैं और जारी कर सकते हैं। –

+0

हां यह एक बुरी स्थिति है लेकिन मैं इसे कम करने की कोशिश कर रहा हूं। कम से कम मैं जांच करूंगा कि प्रमाणपत्र में नाम दिए गए यूआरएल से मेल खाता है। – telesphore4

5

यदि आप स्वयं हस्ताक्षरित कॉल का उपयोग कर रहे हैं तो केवल एक ही त्रुटि जो आपको उम्मीद करनी चाहिए वह रूट (प्रमाण। जारीकर्ता) पर एक श्रृंखला त्रुटि है। मैं इस तरह कुछ सुझाव दूंगा कि उस श्रृंखला त्रुटि के लिए जाल विशेष रूप से और अन्य सभी त्रुटियों के माध्यम से गिरने देता है।

ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(
    ValidateRemoteCertificate 
); 

private static bool ValidateRemoteCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors policyErrors) 
{ 
    string trustedIssuer = "CN=www.domain.com"; 
    string trustedDomain = "CN=www.domain.com"; 
    bool policyErr = false; 

    switch (policyErrors) 
    { 
     case SslPolicyErrors.None: 
      policyErr |= false; 
      break; 
     case SslPolicyErrors.RemoteCertificateChainErrors: 
      bool chainErr = false; 
      foreach (X509ChainStatus status in chain.ChainStatus) 
      { 
       switch (status.Status) 
       { 
        case X509ChainStatusFlags.NoError: 
         chainErr |= false; 
         break; 
        case X509ChainStatusFlags.UntrustedRoot: 
         if (certificate.Subject != trustedDomain || certificate.Issuer != trustedIssuer) 
          chainErr |= true; 
         else 
          chainErr |= false; 
         break; 
        default: 
         chainErr |= true; 
         break; 
       }      
      } 
      policyErr |= chainErr; 
      break; 
     default: 
      policyErr |= true; 
      break; 
    } 

    return !policyErr; 
} 
1

आप प्रमाणपत्र की जांच कर सकते अगर आप समारोह ValidateRemoteCertificate

System.Net.ServicePointManager.ServerCertificateValidationCallback += (a, b, c, d) => 
{ 
    return ValidateRemoteCertificate(a, b, c, d); 
}; 

private static bool ValidateRemoteCertificate(object sender, X509Certificate certificate, 
      X509Chain chain, SslPolicyErrors policyErrors) 
{ 
      if (certificate.Subject.Equals("CN=www.domain.com")) 
       return true; 
      else 
       return policyErrors == SslPolicyErrors.None; 

} 
+0

कृपया यह मत करें। यह कुछ भी नहीं है क्योंकि यह सुरक्षा के भ्रम को प्रदान करता है लेकिन अभी तक कोई नहीं है। कोई भी इसमें "CN = www.domain.com" स्ट्रिंग के साथ एक प्रमाण बना सकता है। – Daryl

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