Applet de firma y cifrado de Izenpe Tabla de contenidos 1 DESCRIPCIÓN DEL DESARROLLO ....................................................................................... 3 1.1 Componentes desarrollados ................................................................................................ 3 1.2 Licencia de las librerías utilizadas ........................................................................................ 3 1.3 Funcionalidad principal ........................................................................................................ 3 2 REQUISITOS ..................................................................................................................... 6 2.1 Requisitos de la instalación .................................................................................................. 6 3 APPLET DE FIRMA ............................................................................................................ 7 3.1 3.2 3.3 3.4 3.5 Utilización del Applet dentro de una página web ................................................................ 7 Trazas ................................................................................................................................... 7 Métodos del Applet .............................................................................................................. 8 Métodos del Applet destinados a pruebas ........................................................................ 17 Ejemplos ............................................................................................................................. 19 Descripción del desarrollo 1.1 Componentes desarrollados • Applet: Es una aplicación Java en forma applet para poder ser integrada dentro de un navegador con funcionalidad de firma electrónica, cifrado y obtención del código TIES. Se detalla esta funcionalidad en el capítulo 2. • Juegos de pruebas: Existen juegos de pruebas para comprobar la validez del desarrollo. Existen 2 tipos de juegos de pruebas o Pruebas de compatibilidad con los sistemas operativos • Documentación: Esta documentación 1.2 Licencia de las librerías utilizadas Las librerías y licencias utilizadas son: • iText: MPL y LPGL • Bouncycastle: MIT X11 License • Apache XMLSEC: Apache License • Apache Xalan: Apache License • Apache Xerces: Apache License 1.3 1.3.1 Funcionalidad principal Sistemas operativos / navegadores soportados Se consideran soportadas las siguientes combinaciones de navegadores/sistemas operativos: IE6 IE7 IE8 W2000 WXP WV32 WV64 UBU804 OSUSE10 FEDCOR9 FEDCOR11 OSX105INT OSX104INT P11/P12/CSTORE FF3 SAF P11/P12/CSTORE P11/P12/CSTORE P11/P12/CSTORE P11/P12/CSTORE P11/P12/CSTORE P11/P12/CSTORE P11/P12/CSTORE P11/P12/CSTORE P11/P12/CSTORE P11/P12 P11/P12 P11/P12 P11/P12 P11/P12 P11/P12 IE6 = Internet Explorer 6 / IE7 = Internet Explorer 7 / IE8 = Internet Explorer 8 / FF3 = Firefox 3 / SAF=Safari 4 / W2000 = Windows 2000 / WXP = Windows XP / WV32 = Windows Vista 32 / WV64 = Windows Vista 64 bits / UBU804 = Ubuntu 8.04 LTS / OSUSE10 = OpenSuse 10 / FEDCOR9 = Fedora Core 9 / / FEDCOR9 = Fedora Core 11 / OSX105INT = OS X 10.5 Intel / OSX104INT = OSX 10.4 Intel / P11 = soporte para PKCS#11 / P12 = soporte para PKCS#12 / CSTORE = soporte para el amacen criptografico de windows/ 1.3.2 • • • • Primitivas criptográficas implementadas Firma electrónica con los siguientes formatos: o XMLDSig/XAdES (BES, EPES, T, C1) enveloping/enveloped/detached. Soporte multifirma en paralelo (para firmas enveloping) y contrafirma (para firmas enveloped)2. o CMS/CAdES (BES, EPES, T, C) attached/detached. Soporte multifirma en paralelo y contrafirma (no está soportado contrafirmas en multifirma en paralelo) en attached. o XMLDSig enveloping/enveloped/detached. Soporte multifirma. o PDF3 (con y sin sello de tiempo) Verificación de firma para formato CMS attached y dettached. Soporte para PKCS#11, PKCS#12 y almacén criptográfico de Windows. Calculo de resumen SHA‐1 y SHA‐256 1 Para XAdES‐C y CAdES‐C solo se añadirá la respuesta OCSP de Izenpe. 2 Antes de añadir la firma a un documento se comprobará la validez criptográfica de las firmas existentes. 3 No se soportan PDFs protegidos, ni PDF con formularios XFA • • • • 4 Validación de certificados contra el OCSP de IZENPE . Sellado de tiempo contra la TSA de IZENPE. Cifrado/Descifrado 3DES‐CBC con contraseña Búsqueda de certificados en los almacenes criptográficos. 4 Siempre que se proceda a firmar, antes se comprobará que el certificado no esté revocado ni suspendido. Requisitos 2.1 Requisitos de la instalación • Java SUN 1.6 Instalado (1.5 en caso de OSX) • JCE Unlimited Strength Jurisdiction Policy Files instalado • Dispositivos criptográficos instalados en el caso que se quieran utilizar • Acceso a las URLs de TSA y OCSP de Izenpe • Memoria suficiente establecida en el panel de control del plugin de Java (parámetro de configuración ‐Xmx1024m)5 5 En el caso de Fedora es un ejecutable llamado ControlPanel dentro de de la carpeta bin de $JAVA_HOME. Applet de firma 3.1 Utilización del Applet dentro de una página web Para poder utilizar el applet desde una página web se debe especificar el siguiente código dentro de esta: <html> <header <applet code="izenpe.app.applet.AppletApplication.class" archive="izenpesigner‐applet.jar" name="applet"> </header> </applet> <body> … </body> </html> Esto cargará el applet y lo hará accesible mediante la variable applet. 3.2 Trazas Siempre que el applet se ejecuta crea un archivo de trazas. La ubicación del archivo es: • $HOME/.idazki‐trace.txt para sistemas Linux/OSX • %APPDATA%/.idazki‐trace.txt para sistemas Windows 3.3 Métodos del Applet 3.3.1 getLastError Permite recuperar el último error ocurrido. FORMATO DE LA LLAMADA String getLastError() RETORNO El texto del error 3.3.2 setOption Establece una opción genérica del comportamiento del applet FORMATO DE LA LLAMADA void setOption(String key, String value) PARAMETROS • key: Clave • value: Valor Las diferentes opciones que permite son: Clave Funcionalidad timestamp‐url timestamp‐policyoid timestamp‐hashalgo signature‐hashalgo signature‐signerrole URL del servidor de timestamp OID de política requerida del servidor de timestamp Algoritmo de hash del sello de tiempo (SHA‐1 o SHA‐256) Applet de firma Rol del firmante en firmas CAdES/XAdES ades‐add‐policy6 xades‐signature‐policy‐id‐identifier xades‐signature‐policy‐id‐description xades‐signature‐policy‐hash xades‐signature‐policy‐hashalgo xades‐signature‐policy‐qualifier‐url cades‐signature‐policy‐oid cades‐signature‐policy‐hash cades‐signature‐policy‐hashalgo pdf‐signature‐llx pdf‐signature‐lly pdf‐signature‐urx pdf‐signature‐ury pdf‐signature‐page pdf‐signature‐reason pdf‐signature‐location va‐universal‐ocsp‐url “1” si hay que añadir la política a firmas de tipo CAdES/XAdES. Identificador de política XAdES Descripción de la política XAdES Hash de la política para firmas XAdES Algoritmo de hash de política para firmas XAdES URL de la política EPES para firmas XAdES OID de política para firmas CAdES Hash de la política EPES para firmas CAdES Algoritmo de hash de política para firmas CAdES Posición X0 de visualización de firma en PDF Posición Y0 de visualización de firma en PDF Posición X1 de visualización de firma en PDF Posición Y1 de visualización de firma en PDF Página de la firma PDF, 0=última, 1=primera, 2= segunda… Razón de la firma PDF Lugar de la firma URL del validador OCSP para todos los tipos de certificados 3.3.3 getOption Permite recuperar el valor de una opción generica FORMATO DE LA LLAMADA String getOption(String key) PARAMETROS • key: Clave (los mismos que los definidos en setOption) RETORNO El texto del valor 6 Si esta opción està a “1” deberá establecer los parámetros xades‐signature* para tipos XAdES o cades‐signature* para tipos CAdES. 3.3.4 setCryptoStoreAuto Establece la siguiente lógica en la selección de certificados: 1. Intenta leer en todos los dispositivos criptográficos que tienen interfaz PKCS#11 2. (Si 1 ha fallado, en Windows) Lee el almacén criptográfico de Windows 3. (Si 1 ha fallado en Unix) Pregunta por si se desea utilizar un archivo de claves PKCS#12 4. Muestra la lista de certificados encontrados al usuario para su selección FORMATO DE LA LLAMADA boolean setCryptoStoreAuto() RETORNO true si la llamada es satisfactoria 3.3.5 addInput Añade una un componente firmar, cifrar o calcular el hash. FORMATO DE LA LLAMADA boolean addInput(String intype, String in, String outtype, String out) PARAMETROS • intype: tipo de entrada • in: entrada • outtype: tipo de salida • out: salida Los tipos aceptados de entrada (intype) son los siguientes: Tipo file folder inline‐hash inline‐binary inline‐text El parámetro in debe contener el nombre de un archivo El parámetro in debe contener el nombre de un directorio El parámetro in debe contener la codificación en base64 de un hash El parámetro in debe contener la codificación en base64 de un contenido binario El parámetro in debe contener un contenido de texto Los tipos aceptados de salida (outtype) son los siguientes: Tipo file folder inline El parámetro out debe contener el nombre de un archivo El parámetro out debe contener el nombre de un directorio El resultado de la operación será accesible con getOutputContent() RETORNO true si la llamada es satisfactoria EJEMPLO Para seleccionar como entrada un archivo y salida un archivo applet.addInput(“file”,"document.pdf",”file”,”newdoc.pdf”); Para seleccionar como entrada un directorio y salida un directorio applet.addInput(“folder”,"in",”folder”,”out”); Para seleccionar como entrada un hash y salida un archivo applet.addInput(“hash”,"UE+aTxBNj4…",”file”,”detached.xades”); Para seleccionar como entrada un texto y salida mediante llamadas al applet applet.addInput(“inline‐text”,"helloworld!",”inline”,null); 3.3.6 clearInputs Elimina todas las entradas especificadas mediante addInput(…) FORMATO DE LA LLAMADA void clearInputs() 3.3.7 getOutputCount El número de entradas recuperables mediante el método getOutputContent(…) FORMATO DE LA LLAMADA int getOutputCount() RETORNO El número de entradas 3.3.8 getOutputContent Recupera el contenido de una operación, cuya entrada ha sido especificada mediante un outtype de tipo “inline”. FORMATO DE LA LLAMADA String getOutputContent(int index, boolean isBinary) PARAMETROS • index: el índice del elemento que se quiere recuperar • isBinary: indica si se quiere recuperar el contenido en base64 RETORNO El resultado de la operación EJEMPLO El siguiente ejemplo firma un archivo de texto en XAdES‐BES y lo recupera por javascript. applet.addInput(“inline‐text”,"helloworld!",”inline”,null); applet.signSetAdESLevel(“bes”); applet.sign(“xades‐sign‐enveloping”) alert(applet.getOutputContent(0,false)); 3.3.9 getOutputReferenceFile Recupera el documento original sobre el cual se ha realizado una operación. FORMATO DE LA LLAMADA String getOutputReferenceFile (int index) PARAMETROS • index: el índice del elemento que se quiere recuperar RETORNO El nombre del archivo 3.3.10 sign Aplica la firma electrónica a los elementos añadidos mediante el método addInput(…) FORMATO DE LA LLAMADA boolean sign(String type) PARAMETROS • type: tipo de firma Type cades‐sign‐attached cades‐cosign‐attached cades‐countersign‐attached cades‐sign‐dettached xades‐sign‐dettached xades‐sign‐enveloping xades‐countersign‐enveloping xades‐cosign‐enveloped pdf pdf‐timestamped Firma CMS/CAdES attached Añadir firma paralela a un CMS/CAdES attached Añadir contrafirma a un CMS/CAdES attached Firma CMS/CAdES dettached Firma XMLDSig/XAdES dettached Firma XMLDSig/XAdES enveloping Añadir contrafirma a un XMLDSig/XAdES enveloping Crear/Añadir firma XMLDSig/XAdES enveloped Firma PDF Firma PDF con sello de tiempo RETORNO true si la llamada es satisfactoria 3.3.11 signSetAdESLevel Establece el nivel de firma para CAdES/XAdES FORMATO DE LA LLAMADA boolean signSetAdESLevel(String level) PARAMETROS • level: nivel de firma Type none bes t c CMS/XMLDSig CAdES‐BES/XAdES‐BES CAdES‐T/XAdES‐T CAdES‐C/XAdES‐C RETORNO true si la llamada es satisfactoria 3.3.12 cipher Cifra los elementos añadidos mediante el método addInput(…) FORMATO DE LA LLAMADA boolean cipher(String password) PARAMETROS • password: la contraseña de cifrado o bien “*gui” indicando que se debe preguntar al usuario mediante interfaz grafica. RETORNO true si la llamada es satisfactoria 3.3.13 decipher Descifra los elementos añadidos mediante el método addInput(…) FORMATO DE LA LLAMADA boolean decipher(String password) PARAMETROS • password: la contraseña de descifrado o bien “*gui” indicando que se debe preguntar al usuario mediante interfaz grafica. RETORNO true si la llamada es satisfactoria 3.3.14 hash Calcula el hash de los elementos añadidos mediante el método addInput(…) FORMATO DE LA LLAMADA boolean hash() RETORNO true si la llamada es satisfactoria 3.3.15 getTies Recupera el código TIES publico de la tarjeta FORMATO DE LA LLAMADA String getTies () RETORNO El código TIES si la llamada es satisfactoria, null en otro caso. 3.3.16 promptFilesystem Muestra una caja de dialogo preguntando por la entrada/salida de un archivo o directorio FORMATO DE LA LLAMADA String promptFilesystem(String caption, boolean isInput, boolean isFolder) PARAMETROS • caption: mensaje de la caja de dialogo • isInput: true para indicar que es de entrada, false para indicar que es de salida • isFolder: true para indicar que es un directorio, false para indicar que es un archivo RETORNO El código TIES si la llamada es satisfactoria, null en otro caso. 3.4 Métodos del Applet destinados a pruebas 3.4.1 setCryptoStorePkcs12 Utiliza los certificados y las claves privadas de un archivo PKCS#12. Este método está pensado para ser usado en tareas de testing. FORMATO DE LA LLAMADA boolean setCryptoStorePkcs12(String pkcs12path,String pin) PARAMETROS • pkcs12path: ubicación del archivo PKCS#12 • pin: clave del archivo PKCS#12 RETORNO true si la llamada es satisfactoria EJEMPLO applet.setCryptoStorePkcs12("c:/personal.p12",”1111”); 3.4.2 getTrace Recupera el contenido de las trazas registradas FORMATO DE LA LLAMADA String getTrace() RETORNO El contenido de las trazas 3.4.3 traceTime Permite trazar una operación y poder hacer cronometrajes. FORMATO DE LA LLAMADA void traceTime(String trace, String timer) PARAMETROS • trace: Texto de la traza • timer: Identificador del timer EJEMPLO Este ejemplo efectúa una traza de tiempo: applet.traceTime("Inicio traza",”timer1”; … applet.traceTime("Fin de la traza",”timer1”); 3.5 Ejemplos 3.5.1 Firma de un documento en PDF con sello de tiempo archivoEntrada = applet.promptFileSystem(“in?”,true,false); archivoSalida = applet.promptFileSystem(“out?”,false,false); applet.addInput(“file”, archivoEntrada, ”file”, archivoSalida); applet.setCryptoStoreAuto(); applet.sign(“pdf‐timestamped”); 3.5.2 Firma de los documentos de una carpeta en CAdES‐C dettached y recuperación del contenido mediante javascript. applet.addInput(“folder”,"/in",”inline”,null); applet.signSetAdESLevel(“c”); applet.setCryptoStoreAuto(); applet.sign(“cades‐sign‐dettached”); for (i=0;i<applet.getOutputContent();++i) { alert(“signed file=”+applet.getOutputReferenceFile(i,false)); alert(“signature=”+applet.getOutputContent(i,true)); } 3.5.3 Calculo del hash de un archivo y firma en XAdES‐EPES dettached applet.addInput(“file”,"helloworld.data",”inline”,null); applet.hash(); hash = applet.getOutputContent(0,true); applet.setOption("ades‐add‐policy","1”); applet.setOption("xades‐signature‐policy‐id‐identifier","http://url.org"); applet.setOption("xades‐signature‐policy‐hashalgo","SHA‐1"); applet.setOption("xades‐signature‐policy‐qualifier‐url","urn:1.3.2.1"); applet.setOption("xades‐signature‐policy‐hash","nwD62YutwTMOY3oKAV1wQRNJhCA="); applet.clearInputs(); applet.signSetAdESLevel(“bes”); applet.addInput(“inline‐hash”,hash,”file”,”c://helloword‐xades‐signature”); applet.setCryptoStoreAuto(); applet.sign(“xades‐sign‐dettached”); 3.5.4 Cifrado en local de un texto preguntando la contraseña al usuario applet.addInput(“inline‐text”,"cipher‐me!",”inline”,null); applet.cipher(“*gui”); ciphereddata = applet.getOutputContent(0,true); 3.5.5 Recuperación de código TIES 7 alert("TIES‐PUBLIC="+applet.getTies ()); 7 El los sistemas UNIX puede recuperar el código ties mediante la llamada: pkcs11‐tool ‐‐ read‐object ‐‐label 'TIES‐PUB' ‐‐type data