/** * LICENCIA LGPL: * * Esta librería es Software Libre; Usted puede redistribuirla y/o modificarla * 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 * . * * Copyright 2011 Agencia de Tecnología y Certificación Electrónica */ package es.accv.arangi.base.device; import java.io.IOException; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.cert.CertificateException; import org.apache.log4j.Logger; import es.accv.arangi.base.exception.device.OpeningDeviceException; import es.accv.arangi.base.exception.device.WindowsNotFoundException; /** * SOLO FUNCIONA CON VERSIONES DE JAVA A PARTIR DE LA 1.6.

* * Clase para tratar el almacén de certificados de autoridades de certificación * de Windows. Aunque se han dejado todos los métodos de cualquier manager de * keystore, en este almacén no tiene mucha lógica generar pares de claves o * importar claves privadas en general

* * Ejemplo de uso:

* * * IDocument document = new FileDocument(new File ("/documento.txt"));
* CAWindowsKeyStoreManager manager = new CAWindowsKeyStoreManager ();
* String aliases = manager.getAliasNamesList();
* for (int i=0;i *   System.out.println ("Certificate: " + manager.getCertificate(aliases[i]));
*   System.out.println ("Firma: " + manager.signDocument(document, aliases[i])); // Firma con la clave privada del alias
* }
*

* * Cada vez que se trata de insertar un certificado Windows mostrará una ventana * de aviso. * * @author José M Gutiérrez */ public class CAWindowsKeyStoreManager extends AbstractBrowserKeyStoreManager { /* * Logger de la clase */ Logger logger = Logger.getLogger(CAWindowsKeyStoreManager.class); //-- Constructores /** * Constructor: inicializa el keystore de certificados de CA de Windows. * * @throws OpeningDeviceException Error abriendo el keystore personal de Windows * @throws WindowsNotFoundException No existe el almacén de claves de Windows debido * a que la ejecución se produce en un sistema operativo diferente */ public CAWindowsKeyStoreManager () throws OpeningDeviceException, WindowsNotFoundException { if (!System.getProperty("os.name").contains("indows")) { logger.info("[AppleSafariKeyStoreManager]:: El sistema operativo no es Mac OS X sino " + System.getProperty("os.name")); throw new WindowsNotFoundException("El sistema operativo no es Windows sino " + System.getProperty("os.name")); } this.pin = ""; this.ksType = STORE_TYPE_PERSONAL_WINDOWS; try { this.ks = KeyStore.getInstance("Windows-ROOT"); ks.load(null); } catch (KeyStoreException e) { logger.info("[CAWindowsKeyStoreManager]::No se puede obtener una instancia del keystore de certificados de CA de Windows", e); throw new OpeningDeviceException ("No se puede obtener una instancia del keystore de certificados de CA de Windows", e); } catch (NoSuchAlgorithmException e) { logger.info("[CAWindowsKeyStoreManager]::No existe el algoritmo que comprueba la integridad del keystore de certificados de CA de Windows", e); throw new OpeningDeviceException ("No existe el algoritmo que comprueba la integridad del keystore de certificados de CA de Windows", e); } catch (CertificateException e1) { logger.info("[CAWindowsKeyStoreManager]::Alguno de los certificados del dispositivo no puede ser cargado", e1); throw new OpeningDeviceException ("Alguno de los certificados del dispositivo no puede ser cargado", e1); } catch (IOException e1) { logger.info("[CAWindowsKeyStoreManager]::Error de entrada/salida cargando el keystore de certificados de CA de Windows", e1); throw new OpeningDeviceException ("Error de entrada/salida cargando el keystore de certificados de CA de Windows", e1); } } //-- Métodos públicos /** * Cerrar el keystore y eliminar el provider de SUN de la lista de proveedores */ public void close() { logger.debug ("Cerrando Keystore..."); ks = null; logger.debug("Cerrado Keystore...OK"); } @Override public void initialize() { try { this.ks = KeyStore.getInstance("Windows-ROOT"); ks.load(null); } catch (KeyStoreException e) { logger.error("[CAWindowsKeyStoreManager.initialize]::", e); } catch (NoSuchAlgorithmException e) { logger.error("[CAWindowsKeyStoreManager.initialize]:: Error al reinicializar el KeyStore", e); } catch (CertificateException e) { logger.error("[CAWindowsKeyStoreManager.initialize]:: Error al reinicializar el KeyStore", e); } catch (IOException e) { logger.error("[CAWindowsKeyStoreManager.initialize]:: Error al reinicializar el KeyStore", e); } } /* (non-Javadoc) * @see es.accv.arangi.base.device.DeviceManager#isAliasFree(java.lang.String) */ public boolean isAliasFree(String alias){ logger.debug ("[CAWindowsKeyStoreManager.isAliasFree]::Entrada::" + alias); boolean isFree = false; try { isFree = !ks.containsAlias(alias); } catch (KeyStoreException e) { logger.info("[CAWindowsKeyStoreManager.isAliasFree]::Error comprobando si existe el alias '" + alias + "'", e); } return isFree; } }