2011-10-08 8 views
7

का उपयोग कर रिमोट सर्वर X509 प्रमाण पत्र सत्यापित करें मैंने ओपनएसएसएल का उपयोग कर एक सीए और एकाधिक प्रमाणपत्र (सीए द्वारा हस्ताक्षरित) उत्पन्न किया है और मेरे पास SslStream का उपयोग कर एक .NET/C# क्लाइंट और सर्वर है, जिनमें से प्रत्येक के पास अपने स्वयं के प्रमाणपत्र/कुंजी हैं, पारस्परिक प्रमाणीकरण सक्षम है और निरसन अक्षम है।सीए प्रमाणपत्र फ़ाइल

मैं SslStream के लिए RemoteCertificateValidationCallback उपयोग कर रहा हूँ रिमोट सर्वर का सुरक्षा प्रमाणपत्र मान्य करने के लिए और मैं मैं सिर्फ कार्यक्रम में सीए के सार्वजनिक प्रमाणपत्र लोड कर सकता है (एक फ़ाइल के रूप में) और नहीं बल्कि उसके बाद वास्तव में स्थापित करने के लिए दूरदराज के प्रमाण पत्र सत्यापित करने के लिए इसका इस्तेमाल करते हैं उम्मीद कर रही थी विंडोज सर्टिफिकेट स्टोर में सीए। समस्या यह है कि X509Chain कुछ और नहीं दिखाएगा जब तक कि मैं स्टोर में सीए इंस्टॉल नहीं करता, या तो जब मैं प्रमाणपत्रों में से किसी एक का पीईएम संस्करण खोलता हूं तो विंडोज क्रिप्टोएपीआई खोल भी होगा।

मेरे सवाल है, मैं कैसे एक प्रमाण पत्र सत्यापित कर सकते हैं मेरी विशिष्ट द्वारा सीए सिर्फ सीए के सार्वजनिक प्रमाणपत्र फ़ाइल का उपयोग करके विंडोज प्रमाणपत्र संग्रह या WCF का उपयोग करते समय RemoteCertificateValidationCallback, X509Certificate और X509Chain देने के लिए नहीं लग रहे बिना हस्ताक्षर किए गए हैं मुझे काम करने के लिए कुछ भी?

+1

मुझे समझ में नहीं आ रहा है कि विंडोज स्टोर में सीए प्रमाणपत्र क्यों जोड़ना X509Chain को श्रृंखला में दिखाने का कारण बनता है लेकिन यदि मैं नहीं करता कि यह इसका हिस्सा नहीं है। क्या रिमोट सर्टिफिकेट वैलिडेशन कॉलबैक के भीतर श्रृंखला में सीए प्रमाण पत्र जोड़ने के लिए कोई है? – user985122

+0

मुझे अभी भी इसका जवाब नहीं मिल रहा है :( – user985122

उत्तर

5

क्योंकि CA प्रमाणपत्र मूल प्रमाणपत्र की दुकान में नहीं है, तो आप RemoteCertificateValidationCallback() के भीतर करना होगाSslPolicyErrors.RemoteCertificateChainErrors की एक त्रुटि झंडा; एक संभावना है कि आप अपने X509Certificate2Collection के विरुद्ध प्रमाण पत्र श्रृंखला को स्पष्ट रूप से सत्यापित करें, क्योंकि आप स्थानीय स्टोर का उपयोग नहीं कर रहे हैं।

if (sslPolicyErrors == SslPolicyErrors.RemoteCertificateChainErrors) 
{ 
    X509Chain chain0 = new X509Chain(); 
    chain0.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; 
    // add all your extra certificate chain 
    chain0.ChainPolicy.ExtraStore.Add(new X509Certificate2(PublicResource.my_ca)); 
    chain0.ChainPolicy.VerificationFlags = X509VerificationFlags.AllowUnknownCertificateAuthority; 
    isValid = chain0.Build((X509Certificate2)certificate); 
} 

भी कर सकते हैं फिर से उपयोग श्रृंखला कॉलबैक में पारित कर दिया, ExtraStore संकलन में अपने अतिरिक्त प्रमाण पत्र (रों) जोड़ने के लिए, और AllowUnknownCertificateAuthority ध्वज जो जब से तुम अविश्वसनीय जोड़ने की जरूरत है के साथ मान्य श्रृंखला में प्रमाणपत्र (ओं)।

:

तुम भी (निश्चित रूप से उसे एक पॉपअप को खोलता है, के लिए यह एक नया विश्वस्त CA रूट जोड़ने के लिए विश्व स्तर पर एक प्रमुख सुरक्षा समस्या है) विश्वसनीय रूट की दुकान में प्रोग्राम के रूप में CA प्रमाणपत्र जोड़कर मूल त्रुटि रोका जा सकता है

var store = new X509Store(StoreName.Root, StoreLocation.CurrentUser); 
store.Open(OpenFlags.ReadWrite); 
X509Certificate2 ca_cert = new X509Certificate2(PublicResource.my_ca); 
store.Add(ca_cert); 
store.Close(); 
+0

प्रमाण पत्र श्रृंखला बनाने और ट्रस्ट को सत्यापित करने के लिए लाइब्रेरी 'बाउंसीकास्टल' लाइब्रेरी का उपयोग करना एक और संभावना है। विकल्प स्पष्ट हैं और त्रुटियों को समझना आसान है। –

+0

प्रतिक्रिया देखें http : //stackoverflow.com/a/27310276/1038496 यहां अपने स्वयं के सीए की उचित जांच के लिए। उपर्युक्त विधि प्रत्येक सीए (वैधता के लिए कोई जांच नहीं) स्वीकार करेगी। – Zoka

1

मैं एक प्रमाण पत्र सत्यापित कर सकते हैं कैसे विंडोज प्रमाणपत्र संग्रह या WCF का उपयोग किए बिना मेरी विशिष्ट द्वारा सीए सिर्फ सीए के सार्वजनिक प्रमाणपत्र फ़ाइल का उपयोग करके हस्ताक्षरित किया गया है जब RemoteCertificateValidationCallback, X509Certificate और X509Chain मुझे कुछ भी काम करने के लिए देने के लिए नहीं है साथ में?

निम्न कोड Windows प्रमाणपत्र स्टोर से बच जाएगा और श्रृंखला को सत्यापित करेगा। यह विशेष रूप से झंडे के उपयोग में जेबी के कोड से थोड़ा अलग है। नीचे दिए गए कोड को AllowUnknownCertificateAuthority की आवश्यकता नहीं है (लेकिन यह X509RevocationMode.NoCheck का उपयोग करता है क्योंकि मेरे पास सीआरएल नहीं है)।

फ़ंक्शन का नाम कोई फर्क नहीं पड़ता। नीचे, VerifyServerCertificateSslStream कक्षा में समान कॉलबैक है। आप ServicePointManager में ServerCertificateValidationCallback के लिए भी इसका उपयोग कर सकते हैं।

static bool VerifyServerCertificate(object sender, X509Certificate certificate, 
    X509Chain chain, SslPolicyErrors sslPolicyErrors) 
{ 
    try 
    { 
     String CA_FILE = "ca-cert.der"; 
     X509Certificate2 ca = new X509Certificate2(CA_FILE); 

     X509Chain chain2 = new X509Chain(); 
     chain2.ChainPolicy.ExtraStore.Add(ca); 

     // Check all properties 
     chain2.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag; 

     // This setup does not have revocation information 
     chain2.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; 

     // Build the chain 
     chain2.Build(new X509Certificate2(certificate)); 

     // Are there any failures from building the chain? 
     if (chain2.ChainStatus.Length == 0) 
      return true; 

     // If there is a status, verify the status is NoError 
     bool result = chain2.ChainStatus[0].Status == X509ChainStatusFlags.NoError; 
     Debug.Assert(result == true); 

     return result; 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex); 
    } 

    return false; 
} 

मैं पता लगा नहीं कैसे कॉलबैक के लिए कोई आवश्यकता नहीं है ऐसी है कि डिफ़ॉल्ट रूप से इस श्रृंखला (नीचे chain2) का उपयोग करने के लिए है।यही है, इसे एसएसएल सॉकेट पर स्थापित करें और कनेक्शन "बस काम करेगा"। और मेरे पास पता लगाया गया है कि इसे कैसे इंस्टॉल किया गया है कि यह कॉलबैक में पारित हो गया है। यही है, मुझे कॉलबैक के प्रत्येक आमंत्रण के लिए श्रृंखला बनाना है। मुझे लगता है कि ये नेट में आर्किटेक्चरल दोष हैं, लेकिन मुझे कुछ स्पष्ट याद आ रही है।

+0

यह ठीक दिखता है। 'चेन 2' की सूची होगी प्रमाणित प्रमाण और रूट प्रमाण के बीच प्रमाण पत्र ट्रस्ट। आजकल, यदि आप प्रमाणपत्रों पर उन्नत संचालन करते हैं तो आप BouncyCastle लाइब्रेरी का उपयोग करना चाहेंगे। –