【问题标题】:Invalid Signature Reading XML from Http Response从 Http 响应读取 XML 的签名无效
【发布时间】:2013-04-09 14:12:56
【问题描述】:

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


这就是我想要完成的任务:

  1. 在服务器上创建一个签名的 XML 文档
  2. 将签名的 XML 作为 HTTP 响应的正文发送
  3. 客户端收到响应并验证签名是否有效。

在服务器端,我创建 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完全相同。

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

【问题讨论】:

    标签: c# xmldocument xml-signature


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多