【问题标题】:Java - XML digital signature with more referencesJava - 具有更多参考的 XML 数字签名
【发布时间】:2017-09-16 09:32:56
【问题描述】:

我正在尝试使用 Java 创建 XML 数字签名。 我的代码如下:

XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");
// create Reference to Object element
Reference objectRef = fac.newReference(
    "#Res",
    fac.newDigestMethod(DigestMethod.SHA256, null)
);
// create Reference to KeyInfo element
Reference keyInfoRef = fac.newReference(
    "#KeyInfo",
    fac.newDigestMethod(DigestMethod.SHA256, null)
);

我的问题是,我需要使用两个引用创建 XML 数字签名 - 引用 Res 对象和 KeyInfo。创建两个引用元素并调用签名方法后,Java 给了我这个错误:

Exception in thread "main" javax.xml.crypto.dsig.XMLSignatureException: javax.xml.crypto.URIReferenceException: com.sun.org.apache.xml.internal.security.utils.resolver.ResourceResolverException: Cannot resolve element with ID KeyInfo
at org.jcp.xml.dsig.internal.dom.DOMReference.dereference(DOMReference.java:431)
at org.jcp.xml.dsig.internal.dom.DOMReference.digest(DOMReference.java:359)
at org.jcp.xml.dsig.internal.dom.DOMXMLSignature.digestReference(DOMXMLSignature.java:496)
at org.jcp.xml.dsig.internal.dom.DOMXMLSignature.sign(DOMXMLSignature.java:379)
at XmlDigitalSignatureGenerator.generateXmlDigitalSignature(XmlDigitalSignatureGenerator.java:108)
at Main.main(Main.java:25)

谢谢。

【问题讨论】:

  • 你的代码很简单!
  • KeyInfo 仅在签名生成期间创建。可能是 API 不允许直接对 KeyInfo 进行签名。如果此KeyInfo 用于选择密钥进行验证,则对其进行签名不会提供太多额外的安全性。一般来说,验证密钥已经签名,是证书的一部分,所以这种功能没有太多用处。

标签: java xml reference digital-signature


【解决方案1】:

使用验证模式来注册带有 ID 引用的元素我可以解决这个问题

XMLStructure content = new DOMStructure(doc.getDocumentElement());
XMLObject obj = fac.newXMLObject(Collections.singletonList(content), "KeyInfo", null, null);

现在“keyInfo”已注册,因此将允许签名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 2016-02-14
    • 1970-01-01
    • 2015-01-26
    相关资源
    最近更新 更多