使用xml中的公钥进行javax.xml.crypto.dsig验证

使用xml中的公钥进行javax.xml.crypto.dsig验证,java,xml-signature,Java,Xml Signature,使用javax.xml.crypto.dsig,如何在不指定公钥的情况下解组和验证XMLSignature?公钥似乎在签名的xml中,但我无法找到获取它的方法 DOMValidateContext valContext = new DOMValidateContext(key,signatureNode); XMLSignature signature = fac.unmarshalXMLSignature(valContext); boolean coreValidity = signatur

使用javax.xml.crypto.dsig,如何在不指定公钥的情况下解组和验证XMLSignature?公钥似乎在签名的xml中,但我无法找到获取它的方法

DOMValidateContext valContext = new DOMValidateContext(key,signatureNode);
XMLSignature signature = fac.unmarshalXMLSignature(valContext);
boolean coreValidity = signature.validate(valContext);
据我所知,有必要向DOMValidateContext传递一个KeySelector而不是一个键。但是,我不知道如何实现KeySelector

以下是我找到的关于如何实现KeySelect的唯一示例:

不幸的是,它不起作用。在该实现中,它执行以下操作,但总是失败,因为没有KeyValue元素(它们似乎不是KeyValue元素,而是org.jcp.xml.dsig.internal.dom.DOMX509Data元素,无法从中提取密钥)

List List=keyInfo.getContent();
对于(int i=0;i
那么,有没有办法做到这一点?我希望能够在不需要公钥的情况下验证xml文件的签名。我只想从xml中获取公钥。

扩展检查xs是否是KeyValue实例的if()条件,以检查X509Data实例,如下所示:

else if (xs instanceof X509Data) {
     for (Object data : ((X509Data) xs).getContent()) {
          if (data instanceof X509Certificate) {
              pk = ((X509Certificate) data).getPublicKey();
          }
     }
}

只需将xmldsig.jar包含到您的构建路径中,并检查您的JDK中是否有必须添加到构建路径中的1.5 对于1.6,它们内置在其中,因此无需添加以供参考

注意这里的
X509Certificate
类必须是
java.security.cert.X509Certificate
而不是
javax.security.cert.X509Certificate
else if (xs instanceof X509Data) {
     for (Object data : ((X509Data) xs).getContent()) {
          if (data instanceof X509Certificate) {
              pk = ((X509Certificate) data).getPublicKey();
          }
     }
}