0

我正在尝试实现需要封装 XML 数字签名 (XMLDSIG) 的行业规范。我的规范不符合示例 ( <Signature>),而是使用自己的名称作为签名元素:

<xs:element name="ensembleSignature" type="dsig:SignatureType" />
<!-- wish this was:  <xs:element ref="dsig:Signature" />  -->

因此,该元素未命名为“Signature”,并且位于域的 XML 命名空间而不是 dsig XML 命名空间中。

通过大量额外的工作,我可以在 .NET 中创建这个自定义签名。

  1. 我使用 .NET SignedXml 类创建 <dsig:Signature> 元素
  2. 我操作 DOM 以删除 <dsig:Signature> 并将元素重新创建为 <myns:ensembleSignature>。

但似乎 .NET 无法验证传入的 <myns:ensembleSignature>,即使我将传入元素重命名回 <dsig:Signature>。

我已经多次阅读过 XMLDSIG 规范,尽管他们的所有示例都使用 <Signature> 它似乎并不特别需要这个元素名称,即使对于封装转换也是如此。那么这是 SignedXml 中的一个错误,即当 XMLDSIG 规范中没有这样的要求时,它只支持这个单个元素名称?

4

1 回答 1

0

在 .NET 中无法使用非标准元素名称。但签名元素名称不是摘要的一部分,因此您可以删除“自定义”签名元素并添加“标准”签名元素名称 (<Signature>),但请注意不要更改 SignedInfo 中的任何空格或命名空间元素,因为 SignedInfo摘要的一部分。在规范化方法中,我使用的空格很重要,元素的命名空间也很重要。

  1. 将 XML 加载到 XmlDocument
  2. 找到 <customSignature xmlns="http://b-to-b.com/Namespace">
  3. 创建新元素 <Signature>
  4. 将 <customSignature> 的所有子级移动到
    • 注意不要干扰 <SignedInfo> 的空白或命名空间上下文。
  5. 将 <customSignature> 替换为 <Signature>
  6. 使用 .NET SignedXml 类验证签名
于 2012-03-12T20:39:10.193 回答