2011-01-13 16 views
5

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.

Respuesta

5

Extender la condición if() que ha de comprobar para ver si x es una instancia de KeyValue también 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(); 
      } 
    } 
} 
+0

tenga en cuenta que la clase 'X509Certificate' aquí tiene por qué ser' java.security.cert .X509Certificate' y no 'javax.security.cert.X509Certificate'. –

Cuestiones relacionadas