/** * LICENCIA LGPL: * * Esta librería es Software Libre; Usted puede redistribuirlo y/o modificarlo * bajo los términos de la GNU Lesser General Public License (LGPL) * tal y como ha sido publicada por la Free Software Foundation; o * bien la versión 2.1 de la Licencia, o (a su elección) cualquier versión posterior. * * Esta librería se distribuye con la esperanza de que sea útil, pero SIN NINGUNA * GARANTÍA; tampoco las implícitas garantías de MERCANTILIDAD o ADECUACIÓN A UN * PROPÓSITO PARTICULAR. Consulte la GNU Lesser General Public License (LGPL) para más * detalles * * Usted debe recibir una copia de la GNU Lesser General Public License (LGPL) * junto con esta librería; si no es así, escriba a la Free Software Foundation Inc. * 51 Franklin Street, 5º Piso, Boston, MA 02110-1301, USA o consulte * <http://www.gnu.org/licenses/>. * * Copyright 2007 Ministerio de Industria, Turismo y Comercio * */ package es.mityc.firmaJava.ejemplos.xades; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.rmi.RemoteException; import java.security.cert.X509Certificate; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import es.mityc.firmaJava.libreria.ConstantesXADES; import es.mityc.firmaJava.libreria.xades.DatosFirma; import es.mityc.firmaJava.libreria.xades.DatosOCSP; import es.mityc.firmaJava.libreria.xades.DatosSelloTiempo; import es.mityc.firmaJava.libreria.xades.ResultadoValidacion; import es.mityc.firmaJava.libreria.xades.ValidarFirmaXML; import es.mityc.firmaJava.policy.PolicyResult; /** * Clase de ejemplo que ilustra los datos accesibles tras la validación XAdES * utilizando la librería XADES * * @author Ministerio de Industria, Turismo y Comercio * @version 0.9 beta */ public class EjemploXADESValidacionConDatosFirma { private final static String FICHERO_XADES_VALIDO = "out.xml"; public static void main(String[] args) { EjemploXADESValidacionConDatosFirma p = new EjemploXADESValidacionConDatosFirma(); p.validarFichero(System.getProperty("user.dir") + "/"); } /** * Método análogo al comentado en el proyecto EjemploXADESValidacion, con la * información mostrada por consola ampliada en profundidad * @param fichero */ public void validarFichero(String ruta) { // Se declara la estructura de datos que almacenará el resultado de la validación ResultadoValidacion result = null; // Se captura el fichero a validar File file = new File(ruta + FICHERO_XADES_VALIDO); // Se parsea el fichero a validar FileInputStream fis = null; byte[] datos = null; try { fis = new FileInputStream(file); datos = new byte[fis.available()]; fis.read(datos); } catch (Exception ex) { ex.printStackTrace(); } finally { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } // Se instancia el validador y se realiza la validación try { ValidarFirmaXML vXml = new ValidarFirmaXML(); result = vXml.validar(datos, ruta, null); } catch (Exception e) { e.printStackTrace(); } // Se muestra por consola el resultado de la validación boolean isValid = result.isValidate(); System.out.println("\n-----------------"); System.out.println("--- RESULTADO ---"); System.out.println("-----------------"); if (isValid) { System.out.println("La firma es valida"); } else { System.out.println("La firma NO es valida\n" + result.getLog()); return; } // se muestran los datos contenidos en el resultado de la firma try { mostrarDatosFirmaXADES(result); } catch (RemoteException e) { e.printStackTrace(); } } /** * Método que muestra por consola la estructura de datos resultado de la validación XAdES * @param datos * @throws RemoteException */ private void mostrarDatosFirmaXADES(ResultadoValidacion datos) throws RemoteException { // Formateador de fechas SimpleDateFormat formateador = new SimpleDateFormat("dd/MM/yyyy"); System.out.println("\n\n-------------------------"); System.out.println("--- DATOS DE LA FIRMA ---"); System.out.println("-------------------------"); // Se obtiene el último nivel XAdES válido String nivVal = datos.getNivelValido(); if (nivVal == null || nivVal == "") nivVal = "No se pudo validar ningun nivel"; System.out.println("Ultimo nivel valido: " + nivVal); // El método datos.getEnumNivel() devuelve la misma información en formato EnumFormatoFirma // Se obtiene el Log de error (estará vacío si no hubo ninguno) String errores = datos.getLog(); if (errores == null || errores == "") errores = "No hay errores."; System.out.println("Error: " + errores); // Supuesto nivel sin válidar (si la firma es válida, coincidirá con getNivelValido) System.out.println("El nivel de la firma llega hasta: " + datos.getEnumNivel()); // Se puede obtener la firma ya parseada en formato Document mediante el método datos.getDoc() // Obtenemos los datos de firma obtenidos DatosFirma datosFirma = datos.getDatosFirma(); if (datosFirma == null) return; // Fecha de firma Date fecha = datosFirma.getFechaFirma(); if (fecha != null) { String fechaFormateada = formateador.format(fecha); System.out.println("Fecha de firma: " + fechaFormateada); } // Obtenemos el certificado firmante System.out.println("\n ----- Certificado de firma -----"); X509Certificate cert = (X509Certificate)datosFirma.getCadenaFirma().getCertificates().get(0); System.out.println("Emitido para: " + cert.getSubjectX500Principal().getName()); System.out.println("Emitido por: " + cert.getIssuerX500Principal().getName()); String emision = formateador.format(cert.getNotBefore()); System.out.println("Emitido el: " + emision); String caducidad = formateador.format(cert.getNotAfter()); System.out.println("Caduca el: " + caducidad); System.out.println("------------------------------"); // Resultados OCSP ArrayList<DatosOCSP> arrayOCSP = datosFirma.getDatosOCSP(); if (arrayOCSP != null) { int nodesOCSPRefLength = arrayOCSP.size(); System.out.println("\n\nHay " + nodesOCSPRefLength + " respuestas OCSP"); for (int i=0; i<nodesOCSPRefLength; i++) { DatosOCSP datosOCSP = arrayOCSP.get(i); System.out.println("--- Respuesta OCSP numero " + (i + 1)+ "---"); // Si la estructura está vacía, indica que no pasó la validación String respuesta = null; if (datosOCSP != null) respuesta = "Certificado validado correctamente"; else respuesta = "Certificado Revocado"; System.out.println("Certificado Consultado: " + datosOCSP.getCertConsultado()); System.out.println("Fecha de la consulta: " + datosOCSP.getFechaConsulta()); System.out.println("Resultado de la validacion: " + respuesta); System.out.println("------------------------------"); } } // Sellos de tiempo Iterator<DatosSelloTiempo> itTSs = datosFirma.getDatosSelloTiempo().iterator(); System.out.println("\n\nHay " + datosFirma.getDatosSelloTiempo().size() + " sellos de tiempo"); int x = 0; while (itTSs.hasNext()) { DatosSelloTiempo dst = itTSs.next(); x++; System.out.println("--- Sello de tiempo numero " + x + "---"); System.out.println("Emisor: " + dst.getEmisor().getName()); System.out.println("Fecha: " + dst.getFecha()); Long precision = dst.getPrecision(); if (precision > 0) System.out.println("Precision: " + dst.getPrecision()); else System.out.println("Precision: No hay datos de la precisión"); System.out.println("------------------------------"); } // Políticas ArrayList<PolicyResult> arrayPoliticas = datosFirma.getPoliticas(); if (arrayPoliticas != null) { int nodesPoliticasLength = arrayPoliticas.size(); System.out.println("\n\nHay " + nodesPoliticasLength + " politicas validadas"); for (int i=0; i<nodesPoliticasLength; i++) { PolicyResult politica = arrayPoliticas.get(i); System.out.println("--- Politica numero " + (i + 1) + "---"); StringBuffer policyRes = new StringBuffer(politica.getPolicyResult()); if (policyRes == null) { if (ConstantesXADES.LIBRERIAXADES_IMPLIEDPOLICY.equals(politica.getPolicyId())) { politica.setPolicyId("Politica implicita"); policyRes = new StringBuffer("La politica no pudo ser validada"); } } else { policyRes = new StringBuffer("Politica invalidada"); policyRes.append(policyRes); } System.out.println("Politica incuida: " + politica.getPolicyId()); System.out.println("Resultado de la validacion: " + policyRes.toString()); System.out.println("------------------------------"); } } // Roles Iterator<String> itRoles = datos.getDatosFirma().getRoles().iterator(); System.out.println("\n\n---- Roles ----"); while (itRoles.hasNext()) { System.out.println("Rol: " + itRoles.next()); } } }