我正在尝试使用对KeyInfo节点的引用来签署XML文档,但在调用“ComputeSignature”方法后,我收到“格式错误的引用元素”异常。
这是我的代码:
signedXml.SigningKey = certificate.PrivateKey;
if (!signParameters.IncludeCertificateInSignature) return;
var certificateKeyInfo = new KeyInfo();
certificateKeyInfo.AddClause(new KeyInfoX509Data(certificate));
signedXml.KeyInfo = certificateKeyInfo;
signedXml.KeyInfo.Id = "xmldsig-keyinfo";
signedXml.AddReference(new Reference("#xmldsig-keyinfo"));
如果我删除“#xmldsig-keyinfo”,它可以工作,但我得到了整个文档的引用,我需要带KeyInfo标记的引用。
答案 0 :(得分:1)
我终于找到了答案,我无法添加KeyInfoId引用,因为XMLDoc中尚未创建xmlElement;所以我实现了SigneXML类并直接从keyInfo返回XML。
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);
}
我希望它有所帮助!!
答案 1 :(得分:0)
以我为例,几天之后就被困了。这是Reference.uri。我将其另存为“#1”。 XML是。
<getTest>
<item ID="1">
<Seed>123</Seed>
</item>
</getTest>
在Windows Server 2003上可以正常运行,但在Windows 10和Windows Server 2012 R2服务器上的开发人员计算机上失败。它属于ComputeSignature方法。
最后,我读到ID(如果必须以字母开头)不能是数字。 https://www.w3.org/TR/html401/types.html#type-name 我将其更改为测试 reference.uri =“ #test”,我更改了基本XML,如下所示。
<getTest>
<item ID="test">
<Seed>123</Seed>
</item>
</getTest>
瞧,它适用于所有环境。
S.O中有一些补丁。会导致它失败并且无法在没有这些修补程序的旧修补程序中工作的新修补程序,而这些修补程序都具有该限制。
KB3140745
KB3140768
KB3140743
KB3073930