我想根据机器商店中的证书验证SignedXml
中的签名。此代码用于验证签名:
internal bool VerifySignature(XmlDocument xml)
{
var signedXml = new SignedXml(xml);
var nsMgr = new XmlNamespaceManager(xml.NameTable);
nsMgr.AddNamespace("ds", "http://www.w3.org/2000/09/xmldsig#");
signedXml.LoadXml((XmlElement)xml.SelectSingleNode("//ds:Signature", nsMgr));
return signedXml.CheckSignature();
}
签名验证正常,但仅针对自身而不是针对计算机上安装的证书。有没有办法根据本地证书存储中的根证书进行检查?
答案 0 :(得分:4)
如果有人有兴趣,我使用了CheckSignature(X509Certificate2, Boolean)
方法。我从Signature
对象获得了证书,并按照以下方式进行了检查:
var x509data = signedXml.Signature.KeyInfo.OfType<KeyInfoX509Data>().First();
var verified = false;
if(x509data != null)
{
var cert = x509data.Certificates[0] as X509Certificate2;
verified = cert != null && signedXml.CheckSignature(cert, false);
}
return verified;
答案 1 :(得分:0)
您可以使用CheckSignature方法的重载,该方法采用AsymmetricAlgorithm。
传递证书的公钥。你可以通过X509Store获取它。