使用xml中的公钥进行javax.xml.crypto.dsig验证
发布时间:2020-12-16 23:15:04 所属栏目:百科 来源:网络整理
导读:使用 javax.xml.crypto.dsig,如何在不指定公钥的情况下解组和验证 XMLSignature?公钥似乎是在签名的xml中,但我无法找到一种方法来获取它. DOMValidateContext valContext = new DOMValidateContext(key,signatureNode);XMLSignature signature = fac.unmars
使用
javax.xml.crypto.dsig,如何在不指定公钥的情况下解组和验证
XMLSignature?公钥似乎是在签名的xml中,但我无法找到一种方法来获取它.
DOMValidateContext valContext = new DOMValidateContext(key,signatureNode); XMLSignature signature = fac.unmarshalXMLSignature(valContext); boolean coreValidity = signature.validate(valContext); 据我所知,有必要将KeySelector而不是Key传递给DOMValidateContext.但是,我无法弄清楚如何实现KeySelector. 这是我发现的关于如何实现KeySelector的唯一示例: 不幸的是它不起作用.在该实现中,它执行以下操作但总是失败,因为没有KeyValue元素(看起来它们是org.jcp.xml.dsig.internal.dom.DOMX509Data元素而不是KeyValue元素,它们无法通过他们的关键). List list = keyInfo.getContent(); for (int i = 0; i < list.size(); i++) { XMLStructure xs = (XMLStructure) list.get(i); if(xs instanceof KeyValue) { PublicKey pk = null; try { pk = ((KeyValue) xs).getPublicKey(); } catch (KeyException ke) { throw new KeySelectorException(ke); } // make sure algorithm is compatible with method if (algEquals(sm.getAlgorithm(),pk.getAlgorithm())) { return new SimpleKeySelectorResult(pk); } } } throw new KeySelectorException("No KeyValue element found!"); 那么,有没有办法做到这一点?我希望能够验证xml文件的签名,而无需使用公钥.我只想从xml获取公钥. 解决方法
扩展你检查的if()条件,看看xs是否是KeyValue的一个实例,也检查X509Data的实例,如下所示:
else if (xs instanceof X509Data) { for (Object data : ((X509Data) xs).getContent()) { if (data instanceof X509Certificate) { pk = ((X509Certificate) data).getPublicKey(); } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |