我正在尝试使用C#和SignedXml类签署Xml(实际上是SOAP xml),签名阶段成功通过,但是当我尝试验证签名时,它告诉我签名无效。我所做的唯一更改是从我使用的MSDN示例中使用XmlDsigExcC14NTransform而不是转换XmlDsigEnvelopedSignatureTransform。如果我使用XmlDsigEnvelopedSignatureTransform,我将获得有效的签名。
这是我的签名代码:
上述代码将为我提供有效的签名,但如果我使用
我将会得到一个无效的签名。
这是我的验证代码:
这是我的签名代码:
private static XmlDocument SignXml(XmlDocument doc)
{
SignedXml signedXml = new SignedXml(doc);
signedXml.SigningKey = Certificate.PrivateKey;
Reference reference = new Reference();
reference.Uri = "";
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
//XmlDsigExcC14NTransform env = new XmlDsigExcC14NTransform();
reference.AddTransform(env);
signedXml.AddReference(reference);
signedXml.ComputeSignature();
XmlElement signature = signedXml.GetXml();
doc.DocumentElement.AppendChild(signature);
doc.Save(SignedXmlPath);
return doc;
}
上述代码将为我提供有效的签名,但如果我使用
XmlDsigExcC14NTransform env = new XmlDsigExcC14NTransform();
替代
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
我将会得到一个无效的签名。
这是我的验证代码:
private static bool Verify(XmlDocument doc)
{
SignedXml signedDoc = new SignedXml(doc);
XmlNodeList nodeList = doc.GetElementsByTagName(Constants.SignatureElement);
signedDoc.LoadXml((XmlElement)nodeList[0]);
return signedDoc.CheckSignature((RSA)Certificate.PublicKey.Key);
}
有人能告诉我如何使用http://www.w3.org/2001/10/xml-exc-c14n#
的转换算法进行签名吗?
先感谢您。