2012-08-01 20 views
7

का उपयोग कर रहा विधि का उपयोग कर रहा नीचे एक्सएमएल दस्तावेजों पर हस्ताक्षर करने के लिए एक XML दस्तावेज साइन इन करना:RSA-SHA256 हस्ताक्षर विधि मुद्दा

public static XmlDocument SignDocument(XmlDocument doc) 
    { 
     string signatureCanonicalizationMethod = "http://www.w3.org/2001/10/xml-exc-c14n#"; 
     string signatureMethod = @"http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"; 
     string digestMethod = @"http://www.w3.org/2001/04/xmlenc#sha256"; 

     string signatureReferenceURI = "#_73e63a41-156d-4fda-a26c-8d79dcade713"; 

     CryptoConfig.AddAlgorithm(typeof(RSAPKCS1SHA256SignatureDescription), signatureMethod); 

     var signingCertificate = GetCertificate(); 

     SignedXml signer = new SignedXml(doc); 
     signer.SigningKey = signingCertificate.PrivateKey; 
     signer.KeyInfo = new KeyInfo(); 
     signer.KeyInfo.AddClause(new KeyInfoX509Data(signingCertificate)); 

     signer.SignedInfo.CanonicalizationMethod = signatureCanonicalizationMethod; 
     signer.SignedInfo.SignatureMethod = signatureMethod; 

     XmlDsigEnvelopedSignatureTransform envelopeTransform = new XmlDsigEnvelopedSignatureTransform(); 
     XmlDsigExcC14NTransform cn14Transform = new XmlDsigExcC14NTransform(); 

     Reference signatureReference = new Reference(); 
     signatureReference.Uri = signatureReferenceURI; 
     signatureReference.AddTransform(envelopeTransform); 
     signatureReference.AddTransform(cn14Transform); 
     signatureReference.DigestMethod = digestMethod; 

     signer.AddReference(signatureReference); 

     signer.ComputeSignature(); 
     XmlElement signatureElement = signer.GetXml(); 

     doc.DocumentElement.AppendChild(signer.GetXml()); 

     return doc; 
    } 


     private static X509Certificate2 GetCertificate() 
    { 

     X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine); 
     store.Open(OpenFlags.ReadOnly); 
     X509Certificate2 card = null; 
     foreach (X509Certificate2 cert in store.Certificates) 
     { 
      if (!cert.HasPrivateKey) continue; 

      if (cert.Thumbprint.Equals("a_certain_thumb_print", StringComparison.OrdinalIgnoreCase)) 
      { 
       card = cert; 
       break; 
      } 
     } 
     store.Close(); 

     return card; 
    } 

जब गणना करने के लिए कोशिश कर रहा प्रकार System.Security.Cryptography.CryptographicException की एक अपवाद उत्पन्न कर रहा है त्रुटि संदेश के साथ हस्ताक्षर अमान्य एल्गोरिदम निर्दिष्ट। कोई विचार?

मशीन: Windows Server 2008 R2

नेट फ्रेमवर्क: 4.0।

आईडीई: विजुअल स्टूडियो 2010.

+4

के अनुसार .NET में लागू नहीं है मैं इस मुद्दे (धन्यवाद फिलिप) का समाधान इस प्रकार है: /* (के बाद वर signingCertificate = GetCertificate कोड की निम्न पंक्तियाँ जोड़ें); */ सीएसपी पैरामीटर cspParams = नया सीएसपी पैरामीटर (24); cspParams.KeyContainerName = "XML_DISG_RSA_KEY"; RSACryptoServiceProvider कुंजी = नया RSACryptoServiceProvider (cspParams); कुंजी। FromXmlString (signCertificate.PrivateKey.ToXmlString (सत्य)); /* हस्ताक्षरकर्ता के हस्ताक्षर के लिए नई कुंजी असाइन करें */ metadataSigner.SigningKey = key; – UncleZen

+0

thx UncleZen ने इसे ठीक किया लेकिन cspParams.KeyContainerName = "XML_DISG_RSA_KEY" यह उपलब्ध नहीं है, यह इसके बिना भी काम करता है। – BitSchupser

उत्तर

2

इस ब्लॉग के लिए बहुत बहुत धन्यवाद। यह वास्तव में मेरी समस्या हल हो गया। वैसे, अगर प्रमाणपत्र फ़ाइल से लोड किया गया है, तो इसे निर्यात करने योग्य होना चाहिए: X509 प्रमाण पत्र 2 x509Key = नया X509 प्रमाण पत्र 2 ("xxxxx.pfx", "123", X509KeyStorageFlags.Exportable);

+0

यह प्रश्न –

+4

का उत्तर नहीं देता है जो प्रश्न का उत्तर नहीं देता है, लेकिन अंकलजेन के समाधान को लागू करने के बाद आपको "निर्दिष्ट स्थिति में उपयोग के लिए मान्य नहीं है" त्रुटि प्राप्त होगी यदि कुंजी को निर्यात योग्य के रूप में फ़्लैग नहीं किया गया था। – BitSchupser

1

@minhj का उत्तर कुछ ब्लॉग के बारे में बताता है, लेकिन लिंक वहां नहीं है।

हालांकि, here का उल्लेख किया गया वर्ग और इसे पंजीकृत करने से समस्या ठीक हो गई। ऐसा लगता है कि यह प्रति ऐप डोमेन में केवल एक बार पंजीकृत होना चाहिए।

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