我在尝试验证已签名 XML 文档的签名时遇到了麻烦。使用 .NET framework 4.0 或 4.5 时验证失败,但在 3.5、3.0 和 2.0 中通过。XML 文档来自基于 Java 的第 3 方服务。
用于签名验证的代码:
public static Boolean VerifyXmlFile(String filename)
{
// Create a new XML document.
var xmlDocument = new XmlDocument() { PreserveWhitespace = true };
// Load the passed XML file into the document.
xmlDocument.Load(filename);
// Create a new SignedXml object and pass it
// the XML document class.
var signedXml = new SignedXml(xmlDocument);
// Find the "Signature" node and create a new
// XmlNodeList object.
XmlNodeList nodeList = xmlDocument.GetElementsByTagName("Signature");
// Load the signature node.
signedXml.LoadXml((XmlElement)nodeList[0]);
// Check the signature using known certifricate and return the result.
var certificate = new X509Certificate2("testCert.cer", "");
return signedXml.CheckSignature(certificate.PublicKey.Key);
}
我尝试手动和直接从第 3 方响应流检查签名,但在 .NET 4.0 或 4.5 中结果始终为 false。
如果签名的 XML 在根元素以外的元素上包含命名空间属性,则 .NET 1.1 中存在已知问题:MSDN
有什么建议么?