2011-06-27 11 views
9

मेरे पास एक विंडोज प्रमाणन प्राधिकरण है जिसका उपयोग मैं क्लाइंट प्रमाणीकरण प्रमाण पत्र को .NET/C# के माध्यम से जारी करने के लिए कर रहा हूं। मैं COM के माध्यम से प्रमाणन प्राधिकरण के एपीआई को कॉल करके प्रोग्रामेटिक रूप से प्रमाणपत्र जारी करने में सफलतापूर्वक इसे प्राप्त करने में सक्षम हूं। जब मैं एक ग्राहक स्थापित करता हूं तो मैं एक नया प्रमाण पत्र जारी करता हूं।मैं कैसे प्रमाणित करूं कि एक प्रमाण पत्र किसी विशेष प्रमाणीकरण प्राधिकारी द्वारा बनाया गया था?

रनटाइम पर, ये क्लाइंट प्रमाण पत्र को मेरे सर्वर से अनुरोध करने के लिए संलग्न करते हैं। मैं प्रोग्रामेटिक रूप से कैसे सत्यापित कर सकता हूं कि X509Certificate2 को मेरे प्रमाणपत्र प्राधिकरण के रूट प्रमाणपत्र द्वारा हस्ताक्षरित किया गया था (और किसी अन्य स्रोत द्वारा हस्ताक्षरित प्रमाण पत्र अस्वीकार कर दिया गया है)?

+1

security.se (शायद) – Woot4Moo

+2

क्यों होना चाहिए? मेरा सवाल यह है कि कोड में साइन इन को कैसे सत्यापित किया जाए ... –

+0

क्या आपको यह कोड करने का कोई तरीका मिला? – MiguelM

उत्तर

14

मैंने यह बहुत कुछ किया है। यहां कुछ आसान कोड है जिसका आप उपयोग कर सकते हैं।

if (!isChainValid) ब्लॉक में हिस्सा एक सुंदर त्रुटि संदेश बनाना है। यदि आप नहीं चाहते हैं तो आपको इसका उपयोग करने की ज़रूरत नहीं है, लेकिन यदि श्रृंखला नहीं बनाई जा सकती है तो आपको एक त्रुटि फेंकनी चाहिए। आपकी जड़ की जांच करने के लिए श्रृंखला तत्व आवश्यक हैं।

X509Certificate2 authority = GetAuthorityCertificate(); 
X509Certificate2 certificateToValidate = GetCertificateToValidate(); 

X509Chain chain = new X509Chain(); 
chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; 
chain.ChainPolicy.RevocationFlag = X509RevocationFlag.ExcludeRoot; 
chain.ChainPolicy.VerificationFlags = X509VerificationFlags.AllowUnknownCertificateAuthority; 
chain.ChainPolicy.VerificationTime = DateTime.Now; 
chain.ChainPolicy.UrlRetrievalTimeout = new TimeSpan(0, 0, 0); 

// This part is very important. You're adding your known root here. 
// It doesn't have to be in the computer store at all. Neither certificates do. 
chain.ChainPolicy.ExtraStore.Add(authority); 

bool isChainValid = chain.Build(certificateToValidate); 

if (!isChainValid) 
{ 
    string[] errors = chain.ChainStatus 
     .Select(x => String.Format("{0} ({1})", x.StatusInformation.Trim(), x.Status)) 
     .ToArray(); 
    string certificateErrorsString = "Unknown errors."; 

    if (errors != null && errors.Length > 0) 
    { 
     certificateErrorsString = String.Join(", ", errors); 
    } 

    throw new Exception("Trust chain did not complete to the known authority anchor. Errors: " + certificateErrorsString); 
} 

// This piece makes sure it actually matches your known root 
var valid = chain.ChainElements 
    .Cast<X509ChainElement>() 
    .Any(x => x.Certificate.Thumbprint == authority.Thumbprint); 

if (!valid) 
{ 
    throw new Exception("Trust chain did not complete to the known authority anchor. Thumbprints did not match."); 
} 
+0

त्रुटियां कभी भी शून्य नहीं होंगी;) – HelloWorld

+0

@HelloWorld ठीक है अगर मैं आज यह लिख रहा था, तो मैं बस 'अगर (त्रुटियों? लम्बाई> 0)' का उपयोग करता हूं। :) सी # 6. जानना अच्छा है; मैंने यह देखने के लिए ToArray() कार्यान्वयन में नहीं पहुंचाया कि क्या होता है यदि 'चयन() '' 'IENumerable' कोई परिणाम नहीं देता है। –

+0

@ChrisBenard यह जांचने के लिए कोड है कि प्रमाणपत्र आपके ज्ञात रूट से मेल खाता है ठीक है? कोड का वह टुकड़ा इस तरह कुछ करने से मेल खाना चाहिए और लगभग हमेशा सच हो जाता है: 'chain.ChainElements.Cast ()। सभी (x => x.Certificate.Thumbprint! = "XX"); ' – Ogglas

0

यदि आप कहते हैं कि आपके पास रूट (जो स्वयं हस्ताक्षरित है) प्रमाणपत्र है, तो आपका एकमात्र विकल्प यह रूट प्रमाणपत्र आपके सर्वर पर उपलब्ध है (पाठ्यक्रम की निजी कुंजी के बिना) और प्रमाण पत्र सत्यापन प्रक्रिया के विरुद्ध आपका रूट प्रमाण पत्र यह सर्वर प्रमाण पत्र श्रृंखला को सत्यापित करने वाले वेब क्लाइंट की प्रतिबिंबित स्थिति है।

+1

मेरे पास बिल्कुल यही परिदृश्य है। मैं अपने प्रश्न को स्पष्ट कर दूंगा, लेकिन मैं साइन इन को सत्यापित करने के लिए आवश्यक विशेष कोड की तलाश कर रहा हूं। –

+0

@ जेफरी मुझे पता है कि यह .NET के लिए हमारे सिक्योरब्लैकबॉक्स में कैसे किया जाता है, लेकिन यह नहीं है कि यह शुद्ध .NET Framework कैसे किया गया है। –

+0

एक बेहतर तरीका हो सकता है लेकिन [X509Chain] (http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509chain.aspx) कक्षा देखें। प्रलेखन उदाहरण प्रत्येक तत्व को जांचते हुए श्रृंखला की जांच करने के लिए कोड दिखाता है। –

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