2011-05-25 25 views
10

मैं ASP.Net में पोस्ट प्रमाणीकरण को संभालने के लिए एक SAML 2.0 प्रतिक्रिया पार्सर लिख रहा हूँ के खिलाफ एक X509Certificate2 सत्यापित करने के लिए (सी # और MVC में है, लेकिन यह कम प्रासंगिक है)।कैसे एक X509Certificate2Collection श्रृंखला

तो मेरे पास .p7b फ़ाइल को सत्यापित करने के लिए X509Certificate2Collection और एक नमूना दावा - एक बेस 64 एन्कोडेड SAML प्रतिक्रिया में पढ़ा जा सकता है।

आदर्श रूप से मैं WSSecurityTokenSerializer, लेकिन that fails में निर्मित का उपयोग करना चाहता हूं, इसलिए मैं काम करने का एक तरीका ढूंढ रहा हूं।

मैं एक्सएमएल पढ़ रहा हूँ के बजाय सीधे:

// get the base 64 encoded SAML 
string samlAssertionRaw = GetFromHttpRequest(); 

// load a new XML document 
var assertion = new XmlDocument { PreserveWhitespace = true }; 
assertion.LoadXml(samlAssertionRaw); 

// use a namespace manager to avoid the worst of xpaths 
var ns = new XmlNamespaceManager(assertion.NameTable); 
ns.AddNamespace("samlp", @"urn:oasis:names:tc:SAML:2.0:protocol"); 
ns.AddNamespace("saml", @"urn:oasis:names:tc:SAML:2.0:assertion"); 
ns.AddNamespace("ds", SignedXml.XmlDsigNamespaceUrl); 

// get the signature XML node 
var signNode = assertion.SelectSingleNode(
    "/samlp:Response/saml:Assertion/ds:Signature", ns); 

// load the XML signature 
var signedXml = new SignedXml(assertion.DocumentElement); 
signedXml.LoadXml(signNode as XmlElement); 

// get the certificate, basically: 
// signedXml.KeyInfo.OfType<KeyInfoX509Data>().First(). 
//  Certificates.OfType<X509Certificate2>().First() 
// but with added checks 
var certificate = GetFirstX509Certificate(signedXml); 

// check the key and signature match 
if (!signedXml.CheckSignature(certificate, true)) 
{ 
    throw new SecurityException("Signature check failed."); 
} 

// go on and read the SAML attributes from the XML doc 

कि बहुत काम करता है, लेकिन सभी यह कर रहा है कि जाँच कर रहा है हस्ताक्षर और SAML प्रतिसाद मैच में X509Certificate2 सार्वजनिक कुंजी। यह किसी भी तरह से सत्यापित नहीं करता है कि यह किससे है, और मुझे SAML प्रमाणीकरण को स्वीकार करने से पहले ऐसा करने की आवश्यकता है।

SAML प्रतिक्रिया में प्राप्त प्रमाणपत्र की जांच करने के दो तरीके दिखाई देते हैं - मैं certificate.Verify() कर सकता हूं या मैं signedXml.CheckSignature(certificate, false) हस्ताक्षर के साथ चेक कर सकता हूं।

हालांकि दोनों झूठी वापसी करते हैं।

मुझे लगता है कि इस ऑनलाइन है कर रहे हैं, क्योंकि वे मशीन की दुकान या संभवतः के खिलाफ जाँच की जा रही (मैं कैसे जांच करने के लिए यकीन नहीं है)। मैं उन्हें X509Certificate2Collection बजाय .p7b फ़ाइल से लिया गया के खिलाफ जाँच करना चाहते हैं - मशीन पर पंजीकृत प्रमाण पत्र अनदेखा किया जाना चाहिए और सिर्फ .p7b प्रमाण पत्र की जाँच की।

या तो Verify या CheckSignature विधियों को पास करने का कोई तरीका नहीं दिखता है।

इस अधिकार की जांच है SAML प्रतिसाद पर कर रही हैं?

वहाँ किसी भी तरह से .p7b प्रमाण पत्र तरह से मैं चाहता हूँ उपयोग करने के लिए है?

+0

GetFirstX509 प्रमाण पत्र क्या करता है? – theycallmemorty

+0

मैंने यहां एक समान प्रश्न पूछा: http://security.stackexchange.com/questions/3905/verify-saml-response-is-from-a-trusted-ource लेकिन आखिर में आपकी पोस्ट पर समाप्त हो गया क्योंकि मेरे पास CheckSignature – theycallmemorty

+0

@theycallmemorty के साथ एक ही समस्या - मैं टिप्पणियों में व्याख्या करने की कोशिश करता हूं, लेकिन यह 'signXml.KeyInfo [0] करता है। प्रमाणपत्र [0] X509Certificate2' के रूप में, लेकिन चेक और कास्ट के साथ। – Keith

उत्तर

5

क्या आपने सत्यापन प्रक्रिया के दौरान ExtraStore प्रमाणपत्रों को खोजने के लिए कॉन्फ़िगर किया गया कस्टम X509Chain का उपयोग करने का प्रयास किया है। निम्नलिखित की तरह कुछ:

// Placeholder for the certificate to validate 
var targetCertificate = new X509Certificate2(); 
// Placeholder for the extra collection of certificates to be used 
var certificates = new X509Certificate2Collection(); 

var chain = new X509Chain(); 

chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; 
chain.ChainPolicy.ExtraStore.AddRange(certificates); 

bool isValidCertificate = chain.Build(targetCertificate); 

उदाहरण निरसन की जांच भी अक्षम किया गया है में लेकिन आप इसे सक्षम सकता है अगर आप CRL को ऑनलाइन या ऑफलाइन पहुंच है।


ExtraStore मध्यवर्ती प्रमाणपत्र कि मशीन/उपयोगकर्ता की दुकान में नहीं हैं शामिल करने के लिए अनुमति चाहिए। हालांकि, X509Chain में निर्दिष्ट एक के आधार पर विश्वसनीय रूट प्रमाणपत्र को मशीन या उपयोगकर्ता स्टोर में होना आवश्यक हो सकता है क्योंकि अन्यथा आपको UntrustedRoot विफल हो जाएगा। यदि रूट भी मशीन या उपयोगकर्ता स्टोर में उपलब्ध नहीं हो सकता है तो आप परिणामी श्रृंखला को चलने की कोशिश कर सकते हैं और गारंटी दे सकते हैं कि आपके पास केवल एक त्रुटि है जो अविश्वसनीय जड़ के कारण है और साथ ही यह गारंटी देता है कि चेन रूट आप क्या है आपके पास सत्यापन के लिए X509Certificate2Collection के आधार पर अपेक्षा की जाएगी।

वैकल्पिक रूप से आप केवल X509Certificate2Collection पर विचार किए गए प्रमाण पत्र को सत्यापित करने के लिए अपना स्वयं का कस्टम X509CertificateValidator बना सकते हैं।

+0

हां, मैंने कोशिश की है - 'chain.build' वापस अमान्य के रूप में आता है क्योंकि मेरा 'X509Certificate2Collection' अमान्य है। हालांकि मैं संग्रह को सत्यापित करने की तलाश नहीं कर रहा हूं, और मुझे '.p7b' की सामग्री को आधिकारिक के रूप में लेने में प्रसन्नता हो रही है - मैं सिर्फ' .p7b' संग्रह के विरुद्ध SAML प्रमाणपत्र देखना चाहता हूं। – Keith

+0

मुझे लगता है कि समस्या 'chain.ChainPolicy.ExtraStore.AddRange' से संबंधित हो सकती है - मैं मौजूदा मशीन या उपयोगकर्ता स्टोर में जोड़ने की तलाश नहीं कर रहा हूं, मुझे केवल' .p7b' फ़ाइल में चाबियों के साथ ताजा शुरू करने की आवश्यकता है । – Keith

+0

निर्माण करने के बाद आपको 'चेनस्टैटस' क्या मिलता है? यह मेरी समझ थी कि 'ExtraStore 'teh मशीन या उपयोगकर्ता स्टोर में कुछ भी नहीं जोड़ता है और केवल सत्यापन प्रक्रिया में निर्दिष्ट प्रमाणपत्र शामिल करता है। –

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