来自Http响应的无效签名读取XML

时间:2013-04-09 14:12:57

标签: c# xmldocument xml-signature

前言:我一直在尝试对HTTP响应进行XML签名验证,我需要帮助!所有代码都是使用C#的.NET 4.0。


所以这就是我想要完成的事情:

  1. 在服务器上创建签名的XML文档
  2. 将签名的XML作为HTTP响应的正文发送
  3. 客户收到回复并验证签名是否有效。
  4. 服务器端,我创建XML并将其加载到XmlDocument中。然后我签署此XmlDocument对象(使用MSDN中的this example code)并从此签名的XML构建一个字符串。这个字符串是我发送的HTTP响应主体。

    当我的客户端应用程序收到响应时,它会将响应的主体拉出并将其传递给我的签名验证功能。此函数从字符串构建XmlDocument,从XmlDocument创建SignedXml对象,并检索要验证的签名。几乎所有这些代码都来自MSDN(here)。

    似乎很简单,对吧?好吧,我的验证每次都失败。我知道签名/验证代码不是问题。我在一个单独的应用程序中对它进行了测试,其中加载的XML来自文件,并且它完美地运行。我甚至使用完全相同的XML来测试我的客户端/服务器代码。

    因此,我认为问题在于将XmlDocument转换为字符串或将字符串转换回XmlDocument的步骤。

    XmlDocument - > 字符串 - > XmlDocument

    我已经做了以下事情,试图让签名更容易验证:

    1. 在创建XmlDocument之前,从XML中删除所有制表符,换行符和回车符。
    2. 确保文档的编码显式设置为UTF-8(我从以前的线程知道,如果没有设置,这可能会导致问题)。
    3. 尝试以两种不同的方式生成字符串(来自XmlDocument的OuterXML,以及使用XmlWriter和StringWriter)。
    4. 目测验证从服务器发送的XML与客户端加载的XML完全相同。

    5. 如果您对如何解决此问题有任何疑问,请提供帮助!如果需要,我可以发布代码,但唯一可能值得看的代码是我如何从XmlDocument生成字符串。

1 个答案:

答案 0 :(得分:0)

一个老问题,但我想我会为其他可能遇到类似问题的人回答这个问题。问题在于字符串的编码,因为它是通过HTTP响应发回的。但是,我通过将XmlDocument直接写入响应流而不是先将其转换为字符串来解决这个问题。像这样:

public void ProcessRequest(HttpContext context)
{
     // a bunch of request handling logic
     //...
     HttpResponse response = context.Response;
     XmlDocument signedXML = getTheSignedXMLData(); //the XML
     signedXML.PreserveWhitespace = true;
     signedXML.Save(response.Output);
 }

这通过编码问题解决,签名验证正确。