サードパーティのWebサービスから応答があります。その応答でXmlDocumentをロードします。
string txt = readStream.ReadToEnd();
response = new XmlDocument();
response.PreserveWhitespace = true;
response.LoadXml(txt);
return response;
次に、証明書を使用して応答が署名されていることを確認します。私はmsdnVerifyXmlDoc(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;
}
プロジェクトのターゲットフレームワークを.NET3.5または.NET3、あるいは.NET 2に設定すると、うまく機能します。結果は真です。しかし、ターゲットフレームワークを.NET 4に変更すると、結果はfalseになります。(そして私は.NET 4を使用する必要があります)
この問題を解決する方法について何かアイデアはありますか?