Xml数字签名 签署KeyInfo


Frederic Vidal最近向我展示了一个关于Xml数字签名的好把戏。 签名的一个很好的技巧。假设你想添加一个看起来像这样的签名。

  <ds:Signature xmlns:ds='  http://www.w3.org/2000/09/xmldsig#  ' Id='Signature001'>  
<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。 参考URI=''>
<ds:Transform>
<ds:Transform Algorithm=' http://www.w3.org/2000/09/xmldsig#enveloped-signature ' />
</ds:Transform>
<ds:DigestMethod Algorithm=' http://www.w3.org/2000/09/xmldsig#sha1 ' />
<ds:DigestValue> sXe2PnaG. .. </ds:DigestValue>
</ds:Reference>
<ds:Reference URI='#KeyInfo001'>
<ds:DigestMethod Algorithm=' http://www.w3.org/2000/09/xmldsig#sha1 ' />
<ds:DigestValue> ZOS23PQ9TcDu+G. ...</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>jTLX0/8XkY2aCte7。 ...</ds:SignatureValue>
<ds:KeyInfo Id='KeyInfo001'>
<ds:X509Data>
<ds:X509Certificate> E3wdSY4n7MgUmJzMIGfMA0. ...</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>

有趣的部分是第二个引用(黑体)--签名 签署了KeyInfo(#KeyInfo001),它是签名元素的一部分 本身的一部分。为签名添加引用的常规api是这样的。

  var reference = new Reference();  
reference.Uri = "#KeyInfo001";


  public class CustomIdSignedXml : SignedXml  
{
public CustomIdSignedXml(XmlDocument doc) : base(doc)
{
return;
}

public override XmlElement GetIdElement(XmlDocument doc, string id)
{
if (String.Compare(id, this.KeyInfo.Id, StringComparison.OrdinalIgnoreCase) == 0)
return this.KeyInfo.GetXml();
else
return base.GetIdElement(doc, id);
}
}