将 XML 签名分配给 .net 中 XML 文档的子节点
Assign XML Signature to a child node of your XMLDocument in .net
是否可以将封装的签名指定为与您签署的文档不同的命名空间中的子项 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 节点中。我面临的问题是第 3 方软件无法验证我的 XML,如果我将签名替换为 XML 文档的最后一个节点,第 3 方可以成功验证它。
问题是在对 SignedInfo 进行规范化时,没有考虑在消息的根和签名最终所在的节点之间定义的名称空间前缀。
SignatureValue 是根据 SignedInfo 计算的,因此有效的解决方案是添加未在 SignedInfo 的 XMLDocument 根中声明的名称空间。这是通过覆盖 XmlDsigC14NTransform:GetOutput(...).
来完成的
是否可以将封装的签名指定为与您签署的文档不同的命名空间中的子项 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 节点中。我面临的问题是第 3 方软件无法验证我的 XML,如果我将签名替换为 XML 文档的最后一个节点,第 3 方可以成功验证它。
问题是在对 SignedInfo 进行规范化时,没有考虑在消息的根和签名最终所在的节点之间定义的名称空间前缀。 SignatureValue 是根据 SignedInfo 计算的,因此有效的解决方案是添加未在 SignedInfo 的 XMLDocument 根中声明的名称空间。这是通过覆盖 XmlDsigC14NTransform:GetOutput(...).
来完成的