2013-05-24 14 views
6

विंडोज 2003 सर्वर पर नेट फ्रेमवर्क 3.5 के साथ वीएस 2008 का उपयोग कर एक्सएमएल हस्ताक्षर सत्यापन पर हस्ताक्षर किए।एसएसओ एसएएमएल (sha256 का उपयोग करके)

हमने सुरक्षा के लिए एसएएमएल के साथ एसएसओ लागू किया है। हम सेवा प्रदाता अंत में काम करते हैं जहां हम ग्राहक के सिस्टम से उत्पन्न हस्ताक्षरित XML SAML Assertuib टोकन को मान्य करते हैं। अब तक जो भी हस्ताक्षरित दस्तावेज हम आए थे वे हस्ताक्षर एल्गोरिदम "आरएसए-शा 1" का उपयोग कर रहे थे, लेकिन अब हमारे पास नया ग्राहक है जो हस्ताक्षर एल्गोरिदम के साथ "आरएसए-शा 256" के रूप में फाइल भेजता है और यहां समस्या शुरू हुई है।

public static string VerifySignature() 
{ 
    if (m_xmlDoc == null) 
     return "Could not load XMLDocument "; 

    try 
    { 
     XmlNamespaceManager nsm = new XmlNamespaceManager(new NameTable()); 
     nsm.AddNamespace("dsig", SignedXml.XmlDsigNamespaceUrl); 
     XmlElement sigElt = (XmlElement)m_xmlDoc.SelectSingleNode(
      "//dsig:Signature", nsm); 

     // Load the signature for verification 
     SignedXml sig = new SignedXml(m_xmlDoc); 
     sig.LoadXml(sigElt); 

     if (!sig.CheckSignature()) 
      return "Invalid Signature"; 
    } 
    catch (Exception ex) 
    { 
     return ex.Message; 
    } 
    return string.Empty; 
} 

अब, जब मैं एक ही कोड इस नए ग्राहक के लिए (हस्ताक्षर एल्गोरिथ्म आरएसए-sha256h के साथ) की कोशिश - इस काम नहीं कर रहा है और मैं त्रुटि "SignatureDescription आपूर्ति हस्ताक्षर एल्गोरिथ्म के लिए नहीं बनाया जा सका हो रही है। "

पिछले 2-3 दिनों में कई ब्लॉग और लेखों के माध्यम से जाना, मुझे पता चला कि SignedXml sha256 का समर्थन नहीं करता है। ठीक। लेकिन अगला क्या है। कहीं इसका उल्लेख है कि डब्ल्यूआईएफ का उपयोग करें, मैंने & भी this की कोशिश की है।

मैं भी RSAPKCS1SignatureDeformatter की VerifySignature विधि का उपयोग करने का प्रयास कर रहा हूं। लेकिन वास्तव में यह सुनिश्चित नहीं है कि पारित होने वाले दो पैरामीटर क्या हैं।

+0

मैं इस धारणा के तहत था कि एन्क्रिप्शन एल्गोरिदम समर्थित था क्योंकि यह X509Certificate2 ऑब्जेक्ट का समर्थन करता है। Sig.checkSignature (...) विधि में एक अधिभार है जो 2 पैरामीटर, X509Certificate2 और बूल लेता है। क्या आपने इसका इस्तेमाल करने और प्रमाण और सत्य में गुजरने की कोशिश की है? –

उत्तर

2

यह "सरल" लेकिन शायद "समाधान" के लिए योग्य नहीं है :) कुछ ग्राहकों के लिए हमने इसका सामना किया है, हमने उन्हें SHA-1 का उपयोग करके साइन इन करने के लिए अपने आईडीपी को बदलने के लिए कहा है। वे इसे बदलने में सक्षम हैं, और जब वे करते हैं तो यह काम करता है।

कोई तकनीकी समाधान नहीं है, लेकिन इसने 'क्षेत्र में' काम किया है, इसलिए मैंने सोचा था कि मैं इसका उल्लेख करूंगा।

+0

मैंने ग्राहकों को उस बदलाव को करने से इंकार कर दिया है, श्वास। –

3

.net 4 के लिए और इससे पहले, मैंने पाया कि आप एक बार निम्न कार्यों से Security.Cryptography जोड़ने http://clrsecurity.codeplex.com/

(ध्यान दें X509CertificateFinder अपने ही है, थंबप्रिंट द्वारा प्रमाणपत्र संग्रह में हस्ताक्षर प्रमाण पत्र के लिए लग रहा है)

 /// <summary> 
     /// Validate an XmlDocuments signature 
     /// </summary> 
     /// <param name="xnlDoc"> The saml response with the signature elemenet to validate </param> 
     /// <returns> True if signature can be validated with certificate </returns> 
     public bool ValidateX509CertificateSignature(XmlDocument xnlDoc) 
     { 
      XmlNodeList XMLSignatures = xnlDoc.GetElementsByTagName("Signature", "http://www.w3.org/2000/09/xmldsig#"); 

      // Checking If the Response or the Assertion has been signed once and only once. 
      if (XMLSignatures.Count != 1) return false; 

      var signedXmlDoc = new SignedXml(xnlDoc); 
      signedXmlDoc.LoadXml((XmlElement)XMLSignatures[0]); 

      var certFinder = new X509CertificateFinder(); 
      var foundCert = certFinder.GetSignatureCertificate(); 

      CryptoConfig.AddAlgorithm(typeof(RSAPKCS1SHA256SignatureDescription), "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"); 
      return signedXmlDoc.CheckSignature(foundCert,false); 
     } 
+2

ध्यान दें कि .NET 4.5 से आपको .NET 4.0 और इससे पहले के किसी भी तृतीय पक्ष लाइब्रेरी को स्थापित करने की आवश्यकता नहीं है। आप बस सिस्टम के लिए एक संदर्भ जोड़ सकते हैं। डिप्लॉयमेंट और कॉल 'सिस्टम। सुरक्षा। क्रिप्टोग्राफी। क्रिप्टो कॉन्फिग.एड एल्गोरिदम (टाइपोफ (आरएसएपीकेसीएस 1 एसएच 256 सिग्नेचर डिस्क्रिप्शन), रुपये एसएस 256 नेमस्पेस);' आपकी प्रक्रिया के भीतर, जिसके बाद मूल प्रश्न में कोड SHA256 हैश के साथ काम करेगा । यह भी देखें http://blogs.msdn.com/b/winsdk/archive/2015/11/15/using-sha256-with-signedxml.aspx – Rory

+0

'कॉन्स स्ट्रिंग RsaSha256Namespace = "http://www.w3.org/ 2001/04/xmldsig-more # rsa-sha256 ";' – maddoxej

1

SHA-256 डिफ़ॉल्ट रूप से .NET 4.5 में सक्षम नहीं है। तो यदि आप .NET 3.5 या 4.0 का उपयोग करते हैं तो आपको codeplex.com से सुरक्षा लाइब्रेरी डाउनलोड करने की आवश्यकता है। एसएचए -2 एल्गोरिदम के खिलाफ सत्यापन और एसएएमएल हस्ताक्षर निर्माण के बारे में अधिक जानकारी के लिए कृपया इन विषयों को http://www.componentpro.com/doc/saml/working-with-sha-256.htm और http://www.componentpro.com/doc/saml/Verifying-XML-Signatures.htm देखें।

आप Ultimate SAML library for .NET.

8

DotNet 4.6.2+ नए sha हैश में बनाया गया है की आवश्यकता होगी। डॉटनैट 4 + के लिए, आरएसए-SHA512, आरएसए-SHA384, और आरएसए-SHA256 तक पहुँच प्राप्त करने के लिए, आपको चाहिए इस कोड को किसी जगह में शामिल करें।

/// <summary>Declare the signature type for rsa-sha512</summary> 
public class RsaPkCs1Sha512SignatureDescription : SignatureDescription 
{ 
    public RsaPkCs1Sha512SignatureDescription() 
    { 
     KeyAlgorithm = typeof(RSACryptoServiceProvider).FullName; 
     DigestAlgorithm = typeof(SHA512CryptoServiceProvider).FullName; 
     FormatterAlgorithm = typeof(RSAPKCS1SignatureFormatter).FullName; 
     DeformatterAlgorithm = typeof(RSAPKCS1SignatureDeformatter).FullName; 
    } 

    public override AsymmetricSignatureDeformatter CreateDeformatter(AsymmetricAlgorithm key) 
    { 
     var sigProcessor = (AsymmetricSignatureDeformatter)CryptoConfig.CreateFromName(DeformatterAlgorithm); 
     sigProcessor.SetKey(key); 
     sigProcessor.SetHashAlgorithm("SHA512"); 
     return sigProcessor; 
    } 

    public override AsymmetricSignatureFormatter CreateFormatter(AsymmetricAlgorithm key) 
    { 
     var sigProcessor = 
      (AsymmetricSignatureFormatter)CryptoConfig.CreateFromName(FormatterAlgorithm); 
     sigProcessor.SetKey(key); 
     sigProcessor.SetHashAlgorithm("SHA512"); 
     return sigProcessor; 
    } 
} 

/// <summary>Declare the signature type for rsa-sha384</summary> 
public class RsaPkCs1Sha384SignatureDescription : SignatureDescription { 
    public RsaPkCs1Sha384SignatureDescription() 
    { 
     KeyAlgorithm = typeof(RSACryptoServiceProvider).FullName; 
     DigestAlgorithm = typeof(SHA384CryptoServiceProvider).FullName; 
     FormatterAlgorithm = typeof(RSAPKCS1SignatureFormatter).FullName; 
     DeformatterAlgorithm = typeof(RSAPKCS1SignatureDeformatter).FullName; 
    } 

    public override AsymmetricSignatureDeformatter CreateDeformatter(AsymmetricAlgorithm key) 
    { 
     var sigProcessor = (AsymmetricSignatureDeformatter) CryptoConfig.CreateFromName(DeformatterAlgorithm); 
     sigProcessor.SetKey(key); 
     sigProcessor.SetHashAlgorithm("SHA384"); 
     return sigProcessor; 
    } 

    public override AsymmetricSignatureFormatter CreateFormatter(AsymmetricAlgorithm key) 
    { 
     var sigProcessor = 
      (AsymmetricSignatureFormatter)CryptoConfig.CreateFromName(FormatterAlgorithm); 
     sigProcessor.SetKey(key); 
     sigProcessor.SetHashAlgorithm("SHA384"); 
     return sigProcessor; 
    } 
} 

/// <summary>Declare the signature type for rsa-sha256</summary> 
public class RsaPkCs1Sha256SignatureDescription : SignatureDescription 
{ 
    public RsaPkCs1Sha256SignatureDescription() 
    { 
     KeyAlgorithm = typeof(RSACryptoServiceProvider).FullName; 
     DigestAlgorithm = typeof(SHA256CryptoServiceProvider).FullName; 
     FormatterAlgorithm = typeof(RSAPKCS1SignatureFormatter).FullName; 
     DeformatterAlgorithm = typeof(RSAPKCS1SignatureDeformatter).FullName; 
    } 

    public override AsymmetricSignatureDeformatter CreateDeformatter(AsymmetricAlgorithm key) 
    { 
     var sigProcessor = 
      (AsymmetricSignatureDeformatter) CryptoConfig.CreateFromName(DeformatterAlgorithm); 
     sigProcessor.SetKey(key); 
     sigProcessor.SetHashAlgorithm("SHA256"); 
     return sigProcessor; 
    } 

    public override AsymmetricSignatureFormatter CreateFormatter(AsymmetricAlgorithm key) 
    { 
     var sigProcessor = 
      (AsymmetricSignatureFormatter)CryptoConfig.CreateFromName(FormatterAlgorithm); 
     sigProcessor.SetKey(key); 
     sigProcessor.SetHashAlgorithm("SHA256"); 
     return sigProcessor; 
    } 
} 

फिर, आपको इस तरह के कोड को कॉल करके इन सिग विवरणों को सक्रिय करना चाहिए। आपको केवल इसे एक बार कॉल करने की आवश्यकता है, इसलिए यदि आप चाहें तो इसे एक स्थिर कन्स्ट्रक्टर से कॉल कर सकते हैं।

CryptoConfig.AddAlgorithm(typeof(RsaPkCs1Sha512SignatureDescription), 
     "http://www.w3.org/2001/04/xmldsig-more#rsa-sha512"); 
    CryptoConfig.AddAlgorithm(typeof(RsaPkCs1Sha384SignatureDescription), 
     "http://www.w3.org/2001/04/xmldsig-more#rsa-sha384"); 
    CryptoConfig.AddAlgorithm(typeof(RsaPkCs1Sha256SignatureDescription), 
     "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"); 

टिप ओ 'इतने पर Microsoft's Carlos Lopez और BitSchupster और Andrew को टोपी।

+0

यह काम मिल रहा है .. मुझे बहुत समय बचाने के लिए बहुत बहुत धन्यवाद .. – amesh

+3

.... और ..... ढांचा 4.6.2 का ख्याल रखता है अतिरिक्त कोड के लिए किसी भी आवश्यकता के बिना इस समस्या। –

+0

@ ओलीजोन्स - क्या आपको पता है कि आपका कोड बाद में टूट जाएगा या बाद में 4.6.2 को लक्षित करने के लिए कदम होगा? –

0

बस इसे .NET Framework 4.6.01590 या उच्चतम पर अपडेट करें और यह किसी भी कोड परिवर्तन के बिना SHA-512 तक समर्थन करेगा।

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