【发布时间】:2012-11-17 22:20:21
【问题描述】:
我收到了来自第 3 方网络服务的响应。我使用该响应加载了一个 XmlDocument。
string txt = readStream.ReadToEnd();
response = new XmlDocument();
response.PreserveWhitespace = true;
response.LoadXml(txt);
return response;
现在我想验证是否使用证书对响应进行了签名。我有一个在msdn 上找到的VerifyXmlDoc(XmlDocument xmlDoc) 方法。
我知道消息是正确的。
public bool VerifyXmlDoc(XmlDocument xmlDoc)
{
SignedXml signed = new SignedXml(xmlDoc);
XmlNodeList signatureNodeList = xmlDoc.GetElementsByTagName("Signature");
signed.LoadXml((XmlElement)signatureNodeList[0]);
X509Certificate2 serviceCertificate = null;
foreach (KeyInfoClause clause in signed.KeyInfo)
{
if (clause is KeyInfoX509Data)
{
if (((KeyInfoX509Data)clause).Certificates.Count > 0)
{
serviceCertificate = (X509Certificate2)((KeyInfoX509Data)clause).Certificates[0];
}
}
}
bool result = signed.CheckSignature(serviceCertificate, true);
return result;
}
如果我将项目的目标框架设置为 .NET 3.5 或 .NET 3 或 .NET 2,效果会很好。结果是真的。但是如果我将目标框架更改为 .NET 4 结果是错误的。 (而且我必须使用 .NET 4)
关于如何解决这个问题的任何想法?
【问题讨论】:
-
您可能会在类似问题中找到帮助:stackoverflow.com/questions/3935600/…
-
使用什么算法来签名?
-
嗨,你能发布异常调用堆栈吗?
-
如果我没看错的话,我认为stackoverflow.com/a/19175738/12502 可以解决您的问题,如果您仍在寻找解决方案。
-
也许通过 .Net 源代码进行调试也会给你一个提示。您可以在 Visual Studio 中的某个地方/以某种方式启用它:stackoverflow.com/questions/8139269/…
标签: c# security certificate signature signedxml