Pregunta

El uso de javax.xml.crypto.dsig, ¿cómo puedo unmarshal y validar un Firma XML sin especificar la clave pública? La clave pública parece estar en el XML firmado, pero no puedo encontrar una manera de conseguirlo.

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 encontrar la manera de poner en práctica 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 que la aplicación hace lo siguiente, pero siempre falla porque no hay elementos KEYVALUE (parece que en lugar de elementos KEYVALUE son elementos org.jcp.xml.dsig.internal.dom.DOMX509Data que no tienen una forma de la ge 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 una manera de hacer esto? Quiero ser capaz de validar la firma de un archivo XML sin necesidad de tener la clave pública. Sólo quiero obtener la clave pública del XML.

¿Fue útil?

Solución

Extender la condición if () que ha de comprobar para ver si XS es ??una instancia de KeyValue también de comprobar instancia de X509Data de la siguiente manera:

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

Otros consejos

basta con incluir xmldsig.jar a su trayectoria de la estructura y comprobar el JDK 1.5 tuya para lo que tiene que agregar a su ruta de compilación el 1,6 que tienen incorporado en ella por lo que no es necesario añadir para referencia http://java.sun.com/developer/technicalArticles/xml/dig_signature_api/

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top