从Http响应中读取XML的签名无效

本文关键字:无效 XML 读取 Http 响应 | 更新日期: 2023-09-27 18:08:20

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


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

  1. 在服务器上创建签名的XML文档
  2. 发送签名XML作为HTTP响应体
  3. 客户端收到响应并验证签名有效。
在服务器端,我创建XML并将其加载到XmlDocument中。然后我对这个XmlDocument对象签名(使用来自MSDN的示例代码),并从这个签名的XML构建一个字符串。这个字符串是我作为HTTP响应体发送的。

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

看起来很简单,对吧?我的验证每次都失败。我知道这不是签名/验证代码的问题。我已经在一个单独的应用程序中对它进行了测试,它加载的XML来自一个文件,它工作得很好。我甚至使用完全相同的XML来测试我的客户机/服务器代码。

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

XmlDocument 字符串 XmlDocument

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

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

如果你对如何解决这个问题有任何想法,请帮助!如果需要,我可以发布代码,但唯一值得查看的代码是如何从XmlDocument生成字符串。

从Http响应中读取XML的签名无效

这是一个老问题,但我想我会为任何可能遇到类似问题的人回答这个问题。问题出在字符串的编码上,因为它是通过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);
 }

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