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

HappyEngineer:

使用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的唯一示例:http : //download.oracle.com/javase/6/docs/technotes/guides/security/xmldsig/XMLDigitalSignature.html

不幸的是,它不起作用。在该实现中,它会执行以下操作,但始终会失败,因为没有KeyValue元素(看来,它们是org.jcp.xml.dsig.internal.dom.DOMX509Data元素,而不是KeyValue元素,无法通过ge从他们的关键)。

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获取公钥。

卡:

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章