【发布时间】: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