将名称空间添加到XML数字签名

时间:2014-12-03 16:54:58

标签: xml saml-2.0 xml-signature

我正在签署一个带有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文档时,这似乎应该是我可以做的事情,但是,对于我的生活,我无法弄清楚我应该怎么做。我在网上搜索过,发现有几个人有这个问题,但是没有找到一个如何解决问题的好例子。

1 个答案:

答案 0 :(得分:0)

由于所有标记都需要该起始命名空间,因此您可以尝试将签名视为使用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

希望有所帮助