2013-06-26 70 views
0

我想用OpenSSL生成的私有RSA密鑰在C#.NET 4.0中籤名XML文件。 我的源代碼如下所示:使用數字簽名證書生成XML文件

public static void SignXml(String filePath, String certificatePath) 
    { 
     CspParameters cspParams1 = new CspParameters(); 
     cspParams1.KeyContainerName = certificatePath; 
     RSACryptoServiceProvider rsakey = new RSACryptoServiceProvider(cspParams1); 


     XmlDocument xmlDoc = new XmlDocument(); 

     // Load an XML file into the XmlDocument object. 
     xmlDoc.PreserveWhitespace = true; 
     xmlDoc.Load(filePath); 
     SignedXml signedXml = new SignedXml(); 
     CspParameters cspParams = new CspParameters(); 
     cspParams.KeyContainerName = certificatePath; 

     // Create a new RSA signing key and save it in the container. 
     RSACryptoServiceProvider Key = new RSACryptoServiceProvider(cspParams); 

     // Add the key to the SignedXml document. 
     signedXml.SigningKey = Key; 

     // Create a reference to be signed. 
     Reference reference = new Reference(); 
     reference.Uri = ""; 

     // Add an enveloped transformation to the reference. 
     XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform(); 

     reference.AddTransform(env); 

     // Add the reference to the SignedXml object. 
     signedXml.AddReference(reference); 
     KeyInfo keyInfo = new KeyInfo(); 

     // Load the X509 certificate. 


     X509Certificate MSCert = X509Certificate.CreateFromCertFile(certificatePath); 


     // Load the certificate into a KeyInfoX509Data object 
     // and add it to the KeyInfo object. 
     keyInfo.AddClause(new KeyInfoX509Data(MSCert)); 
     keyInfo.AddClause(new RSAKeyValue((RSA)Key)); 

     // Add the KeyInfo object to the SignedXml object. 
     signedXml.KeyInfo = keyInfo; 
     // Compute the signature. 
     signedXml.ComputeSignature(); 

     // Get the XML representation of the signature and save 
     // it to an XmlElement object. 
     XmlElement xmlDigitalSignature = signedXml.GetXml(); 

     // Append the element to the XML document. 
     xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, true)); 


     xmlDoc.Save(filePath); 
    } 

我打電話我作爲一個DLL(名爲DBTBeneficiariesCPSMS)和代碼應用程序的類(CPSMSXmlGenerator)調用,它是:

Dim genXml As String = DBTBeneficiariesCPSMS.CPSMSXmlGenerator.getXmlFile1(xml) 

     'Dim appPath As String = Request.PhysicalApplicationPath 
     Dim fullPath As String = Server.MapPath("/XML/") + dataSource + ".xml" 
     lblMessage.Text = fullPath 
     Dim SwFromFile As StreamWriter = New StreamWriter(fullPath) 
     SwFromFile.Write(genXml) 
     SwFromFile.Flush() 
     SwFromFile.Close() 

     CPSMSXmlGenerator.SignXml(fullPath, Server.MapPath("/XML/aua.cer")) 

現在的問題是每當我的應用程序運行時,它停在'Reference.Uri =「」',錯誤爲: - 錯誤:需要XmlDocument上下文來解析參考Uri。

被顯示,並且生成沒有數字簽名證書的XML文件。

回答

1

xmDoc不會傳遞給SignedXml。通過param應該解決問題

SignedXml signedXml = new SignedXml(xmlDoc);