在xml中使用公钥验证javax.xml.crypto.dsig
问题描述:
使用javax.xml.crypto.dsig,如何在不指定公钥的情况下解组并验证XMLSignature?公钥似乎在签名的XML中,但我无法想出一个办法来得到它。在xml中使用公钥验证javax.xml.crypto.dsig
DOMValidateContext valContext = new DOMValidateContext(key,signatureNode);
XMLSignature signature = fac.unmarshalXMLSignature(valContext);
boolean coreValidity = signature.validate(valContext);
据我可以告诉有必要通过一个KeySelector,而不是一键使用DOMValidateContext的。但是,我无法弄清楚如何实现一个KeySelector。
这里是我发现如何实现一个KeySelector唯一的例子: http://download.oracle.com/javase/6/docs/technotes/guides/security/xmldsig/XMLDigitalSignature.html
遗憾的是它不工作。在那个实现中,它执行以下操作,但总是失败,因为没有KeyValue元素(它看起来代替了KeyValue元素,它们是org.jcp.xml.dsig.internal.dom.DOMX509Data元素,它们没有办法通过从他们的关键)。
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是键值的一个实例,同时检查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它们它已经内置所以不需要添加参考 http://java.sun.com/developer/technicalArticles/xml/dig_signature_api/
注意`X509Certificate`类在这里需要`java.security.cert中.X509Certificate`而不是`javax.security.cert.X509Certificate`。 – 2015-09-17 16:19:47