2011-09-07 11 views
13

मान लीजिए कि मैं तीन प्रमाण पत्र (Base64 प्रारूप में) करते हैंसी # मैं रूट-सीए-सर्ट प्रमाणपत्र (x50 9) श्रृंखला को कैसे सत्यापित कर सकता हूं?

Root 
| 
--- CA 
    | 
    --- Cert (client/signing/whatever) 

मैं प्रमाणपत्र और सी # में प्रमाण पत्र पथ/श्रृंखला कैसे मान्य कर सकते हैं? (ये सभी तीन कर्ट मेरे कंप्यूटर प्रमाण स्टोर में नहीं हो सकते हैं)

संपादित करें: BouncyCastle को सत्यापित करने के लिए कार्य है। लेकिन मैं किसी तीसरे पक्ष की लाइब्रेरी का उपयोग न करने की कोशिश कर रहा हूं।

byte[] b1 = Convert.FromBase64String(x509Str1); 
    byte[] b2 = Convert.FromBase64String(x509Str2); 
    X509Certificate cer1 = 
     new X509CertificateParser().ReadCertificate(b1); 
    X509Certificate cer2 = 
     new X509CertificateParser().ReadCertificate(b2); 
    cer1.Verify(cer2.GetPublicKey()); 

यदि cer1 प्रमाणपत्र 2 (सीए या रूट) द्वारा हस्ताक्षरित नहीं है, तो अपवाद होगा। यह वही है जो मैं चाहता हूं।

उत्तर

0

'X509Certificate2.Verify()' पर एक नजर डालें। यह मदद करनी चाहिए।

+0

मैं एक बार में 3 को कैसे सत्यापित कर सकता हूं? मैं 3 certs कैसे श्रृंखला कर सकते हैं? – Jacob

+0

मुझे यकीन नहीं है, लेकिन अस्थायी स्टोर [X509Store] (http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509store.aspx) बनाने का प्रयास करें। उस स्टोर में सभी प्रमाणपत्र जोड़ें। इसके बाद आपको सबसे कम प्रमाण पत्र पर वैध कॉल करना चाहिए। – MichaelMocko

20

X509Chain वर्ग आप भी अनुकूलित कर सकते हैं कि यह कैसे श्रृंखला निर्माण की प्रक्रिया करता है यह करने के लिए डिजाइन किया गया था।

static bool VerifyCertificate(byte[] primaryCertificate, IEnumerable<byte[]> additionalCertificates) 
{ 
    var chain = new X509Chain(); 
    foreach (var cert in additionalCertificates.Select(x => new X509Certificate2(x))) 
    { 
     chain.ChainPolicy.ExtraStore.Add(cert); 
    } 

    // You can alter how the chain is built/validated. 
    chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; 
    chain.ChainPolicy.VerificationFlags = X509VerificationFlags.IgnoreWrongUsage; 

    // Do the validation. 
    var primaryCert = new X509Certificate2(primaryCertificate); 
    return chain.Build(primaryCert); 
} 

X509ChainBuild() == false के बाद सत्यापन विफलता के बारे में अतिरिक्त जानकारी होती है यदि आप इसे की आवश्यकता होगी।

संपादित करें: यह केवल यह सुनिश्चित करेगा कि आपके सीए वैध हैं। यदि आप यह सुनिश्चित करना चाहते हैं कि श्रृंखला समान है तो आप मैन्युअल रूप से अंगूठे की जांच कर सकते हैं। आप निम्न विधि का उपयोग सुनिश्चित करना है कि प्रमाण पत्र श्रृंखला सही है सकते हैं, यह उम्मीद क्रम में श्रृंखला: ..., INTERMEDIATE2, INTERMEDIATE1 (Signer of INTERMEDIATE2), CA (Signer of INTERMEDIATE1)

static bool VerifyCertificate(byte[] primaryCertificate, IEnumerable<byte[]> additionalCertificates) 
{ 
    var chain = new X509Chain(); 
    foreach (var cert in additionalCertificates.Select(x => new X509Certificate2(x))) 
    { 
     chain.ChainPolicy.ExtraStore.Add(cert); 
    } 

    // You can alter how the chain is built/validated. 
    chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; 
    chain.ChainPolicy.VerificationFlags = X509VerificationFlags.IgnoreWrongUsage; 

    // Do the preliminary validation. 
    var primaryCert = new X509Certificate2(primaryCertificate); 
    if (!chain.Build(primaryCert)) 
     return false; 

    // Make sure we have the same number of elements. 
    if (chain.ChainElements.Count != chain.ChainPolicy.ExtraStore.Count + 1) 
     return false; 

    // Make sure all the thumbprints of the CAs match up. 
    // The first one should be 'primaryCert', leading up to the root CA. 
    for (var i = 1; i < chain.ChainElements.Count; i++) 
    { 
     if (chain.ChainElements[i].Certificate.Thumbprint != chain.ChainPolicy.ExtraStore[i - 1].Thumbprint) 
      return false; 
    } 

    return true; 
} 

मैं इस क्योंकि मैं मेरे साथ एक पूर्ण सीए श्रृंखला की जरूरत नहीं है का परीक्षण करने में असमर्थ हूँ , इसलिए कोड को डीबग करना और चरणबद्ध करना सबसे अच्छा होगा।

+0

धन्यवाद। लेकिन मैं जानबूझकर "additionalCertificates" में विभिन्न जारीकर्ता प्रमाणपत्र रख दिया और परिणाम "सही" है :( – Jacob

+0

@Jacob, नई विधि का प्रयास करें। –

+0

धन्यवाद जोनाथन। लेकिन नहीं काम कर रहे। ऐसा लगता है कि chain.Build तरह प्रमाणपत्र की वैधता की पुष्टि करने के है प्रमाण पत्र नहीं है। जब तक कि कर्ट मान्य होते हैं (जब तक प्रमाणपत्र श्रृंखला/पथ गलत है) परिणाम सत्य है। थंबप्रिंट विधि काम नहीं कर रही है क्योंकि सभी थंबप्रिंट अलग हैं (सही पथ/श्रृंखला में भी) – Jacob

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