Usando javax.xml.crypto.dsig, ¿cómo puedo anular y validar una firma XML sin especificar la clave pública? La clave pública parece estar en el xml firmado, pero no puedo encontrar la forma de obtenerlo.validación javax.xml.crypto.dsig usando la clave pública en el xml
DOMValidateContext valContext = new DOMValidateContext(key,signatureNode);
XMLSignature signature = fac.unmarshalXMLSignature(valContext);
boolean coreValidity = signature.validate(valContext);
Por lo que yo puedo decir que es necesario pasar un KeySelector en lugar de la Llave de la DOMValidateContext. Sin embargo, no puedo entender cómo implementar un KeySelector.
Aquí es el único ejemplo que he encontrado acerca de cómo implementar un KeySelector: http://download.oracle.com/javase/6/docs/technotes/guides/security/xmldsig/XMLDigitalSignature.html
Por desgracia, no funciona. En esa implementación, hace lo siguiente, pero siempre falla porque no hay elementos de KeyValue (parece que en lugar de los elementos de KeyValue son elementos org.jcp.xml.dsig.internal.dom.DOMX509Data que no tienen forma de generar el clave de ellos).
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!");
Entonces, ¿hay alguna manera de hacerlo? Quiero poder validar la firma de un archivo xml sin tener que tener la clave pública. Solo quiero obtener la clave pública del xml.
tenga en cuenta que la clase 'X509Certificate' aquí tiene por qué ser' java.security.cert .X509Certificate' y no 'javax.security.cert.X509Certificate'. –