将XML签名分配给.net中XMLDocument的子节点

时间:2018-08-21 15:22:42

标签: c# xml digital-signature xml-signature canonicalization

是否可以将封装的签名分配为与您为XML文档签名的文档位于不同名称空间中的子子级?

例如:

<?xml version="1.0" encoding="UTF-8"?>
<Message xmlns="http://www.w3.org/2001/XMLSchema-instance" xmlns:a="myNamespace">
  <Header>
    <head:sgntr xmlns:head="myHeader"></head:sgntr>
  </Header>
  <Data>
  <a:DataEntry>some data</a:DataEntry>
  <a:DataEntry>some data</a:DataEntry>
 </Data>
</Message>

使用规范化方法XmlDsigC14NTransform计算您的签名,然后将其放置在sgntr节点中。我面临的问题是,第三方软件无法验证我的XML,如果我将签名替换为XML文档的最后一个节点,则第三方可以成功验证它。

1 个答案:

答案 0 :(得分:0)

问题是在规范化SignedInfo时不考虑在消息的根与签名最终到达的节点之间定义的命名空间前缀。 SignatureValue是在SignedInfo上计算的,因此可行的解决方案是在SignedInfo的XMLDocument根目录中添加未声明的名称空间。这是通过覆盖XmlDsigC14NTransform:GetOutput(...)来完成的。