【问题标题】:Adding Digital Signature to an XML Document - Error Bad UID向 XML 文档添加数字签名 - 错误 UID 错误
【发布时间】:2022-08-06 04:43:32
【问题描述】:

我正在尝试对 xml 文件进行数字签名。此代码正在异步运行

ExecutorService executor = Executors.newFixedThreadPool(10);

当代码运行一次然后输出异常:

javax.xml.crypto.dsig.XMLSignatureException: java.security.SignatureException: Bad UID.

at java.xml.crypto/org.jcp.xml.dsig.internal.dom.DOMSignatureMethod.sign(DOMSignatureMethod.java:345)
at java.xml.crypto/org.jcp.xml.dsig.internal.dom.DOMXMLSignature.sign(DOMXMLSignature.java:405)
at com.chubb.util.XMLSignerUtil.signXMLContent(XMLSignerUtil.java:173)
at com.chubb.util.XMLSignerUtil.signFile(XMLSignerUtil.java:187)
at com.chubb.face.INVPanelXml$SignWorker.signContract(INVPanelXml.java:396)
at com.chubb.face.INVPanelXml$SignWorker.run(INVPanelXml.java:362)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:830)

原因:java.security.SignatureException:错误的 UID。

at jdk.crypto.mscapi/sun.security.mscapi.CSignature.signHash(Native Method)
at jdk.crypto.mscapi/sun.security.mscapi.CSignature$RSA.engineSign(CSignature.java:220)
at java.base/java.security.Signature$Delegate.engineSign(Signature.java:1403)
at java.base/java.security.Signature.sign(Signature.java:712)
at java.xml.crypto/org.jcp.xml.dsig.internal.dom.DOMSignatureMethod.sign(DOMSignatureMethod.java:343)
... 8 more

java.security.SignatureException:错误的 UID。

at jdk.crypto.mscapi/sun.security.mscapi.CSignature.signHash(Native Method)
at jdk.crypto.mscapi/sun.security.mscapi.CSignature$RSA.engineSign(CSignature.java:220)
at java.base/java.security.Signature$Delegate.engineSign(Signature.java:1403)
at java.base/java.security.Signature.sign(Signature.java:712)
at java.xml.crypto/org.jcp.xml.dsig.internal.dom.DOMSignatureMethod.sign(DOMSignatureMethod.java:343)
at java.xml.crypto/org.jcp.xml.dsig.internal.dom.DOMXMLSignature.sign(DOMXMLSignature.java:405)
at com.chubb.util.XMLSignerUtil.signXMLContent(XMLSignerUtil.java:173)
at com.chubb.util.XMLSignerUtil.signFile(XMLSignerUtil.java:187)
at com.chubb.face.INVPanelXml$SignWorker.signContract(INVPanelXml.java:396)
at com.chubb.face.INVPanelXml$SignWorker.run(INVPanelXml.java:362)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:830)

    标签: java xml digital-signature xml-signature


    【解决方案1】:

    您是否可以进行并行签名取决于配置和签名类型。例如,您需要确保您创建的所有签名都使用不同的 XML 标识符。否则验证器提取验证信息时会产生歧义,并且会产生损坏的签名。此外,封装或分离签名类型不支持并行签名,因为签名是在 XML 文档的根级别上创建的。 此外,在进行封装签名时,您需要确保您使用的 XPath 表达式仅在 XML 范围内排除当前签名,因此您不应使用http://www.w3.org/2000/09/xmldsig#enveloped-signature创建并行签名。

    您是否能够正确创建单个签名?如果答案是肯定的,那么您选择的签名类型很可能不支持并行签名,或者某个步骤存在配置问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-26
      相关资源
      最近更新 更多