【问题标题】:Adding namespace to XML Digital Signature将命名空间添加到 XML 数字签名
【发布时间】:2014-12-03 16:54:58
【问题描述】:

我正在使用 X509 证书签署 SAML 令牌,并获得看起来不错的签名,除了一个看起来相对较小的问题,但这让我非常头疼。我的签名是这样的:

<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
   <SignedInfo>
      <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
      <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
      <Reference URI="#[removed]">
         <Transforms>
            <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
         </Transforms>
         <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
         <DigestValue>S4...ku4=</DigestValue>
      </Reference>
   </SignedInfo>
   <SignatureValue>oav...T7E=</SignatureValue>
   <KeyInfo>
      <X509Data>
         <X509Certificate>MII...KFl</X509Certificate>
      </X509Data>
   </KeyInfo>
</Signature>

我需要添加一个命名空间ds,使签名看起来像这样:

<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
   <ds:SignedInfo>
      <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
      <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
      <ds:Reference URI="#[removed]">
         <ds:Transforms>
            <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
         </ds:Transforms>
         <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
         <ds:DigestValue>S4...ku4=</ds:DigestValue>
      </ds:Reference>
   </ds:SignedInfo>
   <ds:SignatureValue>oav...T7E=</ds:SignatureValue>
   <ds:KeyInfo>
      <ds:X509Data>
         <ds:X509Certificate>MII...KFl</ds:X509Certificate>
      </ds:X509Data>
   </ds:KeyInfo>
</ds:Signature>

这似乎应该是我在计算签名或将签名块导入现有 XML 文档时可以做的事情,但是,对于我的生活,我无法弄清楚我应该怎么做.我在网上搜索过,发现有几个人遇到了这个问题,但没有找到一个很好的例子来解决这个问题。

【问题讨论】:

  • 您的原始版本已经“命名空间”,这要归功于 Signature 元素上的 xmlns 属性。为什么你需要额外的杂乱的殖民名称?
  • 不幸的是,接收供应商需要额外的混乱。这当然不是我的选择。
  • 这很奇怪,除非您的消费者正在使用一些自制的 XML 解析套件。例如。他们是否坚持前缀也特别是“ds”? OTOH,如果它可以是任何东西 - 即它们实际上正在使用 XML 命名空间感知包 - 那么它可能什么都不是,就像默认规则支持一样。你能问他们为什么他们“需要”不必要的混乱吗?也许可以协商解决方法。
  • 您也可以尝试使用 XSLT 样式表 along these lines 对输出进行后处理。但我仍然认为谈判一个明智的解决方案是优越的。

标签: xml saml-2.0 xml-signature


【解决方案1】:

由于所有标签都需要该起始命名空间,您可以尝试使用 vb.net、c# 或 java 或任何其他编译器将签名视为字符串,并使用 string.replace 方法。我用vb.net给你一个例子:

Dim signature as string = 'place here your file with a stringreader
signature = signature.Replace("<", "<ds:") 'first, all tags
signature = signature.Replace("<ds:/", "</ds:") 'then we correct closing tags

希望对你有帮助

【讨论】:

  • 但是,我不建议手动更改签名,因为它可能会被检测为伪造。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2017-09-21
  • 2013-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
相关资源
最近更新 更多