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