C#下使用Xades库创建无URI属性的XML签名完整主体引用
如何实现无URI属性的ds:Reference的XAdES签名?
当然可以实现!没有URI属性的<ds:Reference>完全符合XML-DSig规范,它默认指代包含该签名的整个XML文档(也就是你的<document>根节点),这正好对应你期望结构里第一个Reference的作用。
你提到使用Caliper/Xades库时遇到未定义URI无法完成签名的问题,大概率是配置Reference对象时的小疏忽——这个库本身支持无URI的Reference,只需要在创建Reference实例时不设置URI属性(或者显式设置为null)即可。
举个.NET环境下的代码示例,对应你要实现的无URI Reference:
// 创建针对整个文档的无URI Reference var documentReference = new Reference(); // 设置摘要算法 documentReference.DigestMethod = new DigestMethod("http://www.w3.org/2001/04/xmlenc#sha256"); // 添加你需要的转换规则 var transforms = new Transforms(); transforms.Add(new Transform("http://www.w3.org/2001/10/xml-exc-c14n#")); documentReference.Transforms = transforms; // 将这个Reference添加到SignedInfo集合中 var signedInfo = new SignedInfo(); signedInfo.CanonicalizationMethod = new CanonicalizationMethod("http://www.w3.org/TR/2001/REC-xml-c14n-20010315"); signedInfo.SignatureMethod = new SignatureMethod("http://www.w3.org/2000/09/xmldsig#rsa-sha1"); signedInfo.AddReference(documentReference); // 后续再添加其他带URI的Reference(比如SignedProperties、KeyInfo的引用) // ...
从你贴出的实际XML结构来看,最终生成的签名已经符合期望——第一个<ds:Reference>确实没有URI属性,如果你是生成过程中报错,检查一下是否误将URI设置为空字符串(有些库会把空字符串解析为无效URI,而非不生成该属性),完全不设置URI字段就能解决问题。
补充说明:XML-DSig规范明确规定,当<ds:Reference>省略URI属性时,签名目标就是包含该签名的整个XML文档,XAdES作为XML-DSig的扩展完全兼容这种用法,所以你的需求是完全可行的。
内容的提问来源于stack exchange,提问作者Mikerad
相关产品推荐
相关产品推荐

