SlideShare une entreprise Scribd logo
1  sur  53
Módulo 2:
Usando el Cliente @firma
Presentación
Ministerio de Hacienda y Administraciones Públicas
AGENDA
 La forja del Cliente @firma
 Integración de los applets @firma
 Despliegue y carga del MiniApplet
 Uso de los applets @firma
 Filtros de certificados
 Uso del Cliente @firma por otras aplicaciones
 Clases de interés
La forja del
Cliente @firma
AGENDA
 El proyecto Cliente @Firma está alojado en:
 Forja del CTT
 Descargas (Binarios, fuentes, documentación,…)
 Repositorio SVN con el código del proyecto.
 Foros
 Listas de correo.
 GitHub
 Repositorio GIT con el código del proyecto
 Los binarios se construyen mediante Maven.
 El repositorio Maven con los artefactos se encuentra en los repositorios de la
Universidad Jaume I.
LA FORJA DEL CLIENTE @FIRMA
 La construcción de los binarios del proyecto y el uso de estos por parte de
otros proyectos se realiza mediante Maven.
 Pasos a seguir:
 Descargarse los proyectos desde uno de los repositorios:
 El SVN del CTT.
 GitHub.
 Construir los binarios:
 mvn clean install (podemos saltar los tests con –DskipTests)
 Construir los proyectos Eclipse mediante Maven:
 mvn eclipse:clean eclipse:eclipse
 Importar los proyectos a Eclipse.
LA FORJA DEL CLIENTE @FIRMA
Integración de los
Applets @firma
AGENDA
 El proyecto Cliente @Firma cuenta en su suite de productos con dos
applets orientados a la realización de operaciones criptográficas:
 Applet Cliente @firma.
 MiniApplet @firma.
 Los applets del Cliente @firma están orientados a ser integrados en un
flujo de trabajo web en el que realizarán las operaciones criptográficas
que requiere el sistema. Se deberá definir una:
 Entrada de datos: Fichero en disco, datos cargados en memoria, datos en
servidor,…
 Salida de datos: Fichero en disco, formulario web, servicio remoto,…
 Las operaciones de los applets serán invocadas mediante llamadas
JavaScript desde la interfaz web.
INTRODUCCIÓN
APPLET CLIENTE @FIRMA
 Applet cliente con todas las funcionalidades de @firma:
 Firma/Multifirma de datos.
 Operaciones automatizadas de firma masiva.
 Cifrado simétrico de datos.
 Generación de sobres electrónicos.
 Acceso a distintos almacenes de certificados y claves.
 Características:
 Interfaces de entrada/salida unificadas para todas las operaciones.
 Configuración en caliente de los almacenes de certificados.
 Configuración por medio de fichero de propiedades JavaScript.
 Sistema de filtros de certificados completamente configurables.
 Solicitud de permisos para acceso a disco
 Muy extendido:
 Desplegado en cientos de organismos públicos.
MINIAPPLET @FIRMA
 Applet cliente con funcionalidades de firma.
 Funcionalidades:
 Despliegue e integración simplificadas.
 Ejecución asíncrona de las operaciones de firma.
 Mejor sistema de tratamiento de errores.
 Sistema de filtros de certificados simplificado.
 Políticas de firma de la AGE preconfiguradas.
 No dispone de funcionalidades de cifrado, generación de sobres digitales,
firma masiva integrada…
 Despliegue compatible con el Cliente de firma móvil.
 Gran estabilidad y fiabilidad.
 Permite que aplicaciones web hagan uso de sus funcionalidades a través
de interfaces JavaScript.
 Orientado a la integración en flujos de trabajo web:
 Trámites web para usuarios.
 Procedimientos internos (Portafirmas).
 Compatibilidad dependiente del navegador web y su versión.
 Sujeto a múltiples restricciones de seguridad en el entorno del usuario.
 Necesitan estar firmados con un certificado de firma reconocido por el
sistema.
 Configurables al compilar para:
 Eliminar o agregar módulos.
 Suspender la ofuscación de código.
CARACTERÍSTICAS DE LOS APPLETS
AGENDA
Despliegue y carga del
MiniApplet
COMPONENTES DEL MINIAPPLET
 El MiniApplet @firma está compuesto por:
 Un applet Java con toda la funcionalidad criptográfica.
 miniapplet-full_X_Y.jar
 Una biblioteca JavaScript para el despliegue y uso del applet.
 miniapplet.js
 Servicios externos:
 Servlet de firma trifásica.
 afirma-server-triphase-signer.war
 Servlets para la comunicación con aplicaciones nativa.
 afirma-signature-retriever.war / afirma-signature-storage.war
 Para desplegarlo todo basta un simple servidor de aplicaciones (Tomcat,
Jboss…)
DESPLIEGUE DEL MINIAPPLET MEDIANTE JAVASCRIPT
 La biblioteca "miniapplet.js" contiene los métodos necesarios para la
carga y el uso del MiniApplet.
 La invocación de los métodos del MiniApplet se realizará a partir del
objeto MiniApplet.
 La invocación deberá realizarse en:
 Un contexto JavaScript situado en el cuerpo del documento HTML.
 Un evento de la página web.
 Una función invocada desde cualquiera de los sitios anteriores.
DESPLIEGUE DEL MINIAPPLET MEDIANTE JAVASCRIPT
 El método de carga del MiniApplet se encuentra en la biblioteca
JavaScript "miniapplet.js":
 cargarMiniApplet(base, keystore)
 base: Ruta de despliegue del MiniApplet.
 keystore: Opcional. Almacén de certificados que debe cargarse.
 Los almacenes de certificados disponibles están en "miniapplet.js":
 MiniApplet.KEYSTORE_WINDOWS
 MiniApplet.KEYSTORE_FIREFOX / KEYSTORE_MOZILLA
 MiniApplet.KEYSTORE_APPLE
 MiniApplet.KEYSTORE_PKCS12
 Seguido de ':' y la ruta del almacén.
 MiniApplet.KEYSTORE_PKCS11
 Seguido de ':' y la ruta de la biblioteca PKCS#11.
 MiniApplet.KEYSTORE_JAVA/KEYSTORE_JCEKS/KEYSTORE_JAVACE
COMPROBACIÓN DE CARGA
 El MiniApplet incorpora el método echo() que sólo muestra información
del sistema, no requiere interacción con el usuario y no puede firmar
cuando el applet se carga correctamente.
 Resultado de la llamada a la función:
 En caso de encontrarse cargado el applet devolverá una cadena con
información sobre el sistema.
 En caso de que no se haya iniciado la carga del applet, por cualquier motivo,
el método echo() devolverá como resultado la cadena "Cliente
JavaScript".
 En caso de producirse un error durante la llamada, se lanzará una excepción.
 Se pueden realizar llamadas periódicas a este método a la espera de que
se obtenga un resultado distinto a "Cliente JavaScript".
CARGA DEL CLIENTE DE FIRMA NAVITO (AUTOFIRMA /
CLIENTE @FIRMA MÓVIL)
 Cuando no es posible cargar el MiniApplet @firma el JavaScript de
despliegue delegará en una aplicación nativa la ejecución de las
operaciones de firma y guardado.
 Motivos por los que no se podría ejecutar el applet:
 Entornos de ejecución no compatible:
 Google Chrome 45 (y superiores)
 Google Android
 Apple iOS
 Denegación de permisos por parte del usuario.
 No confianza en los certificados de firma.
 Etc.
 Las aplicaciones nativas compatibles son:
 Cliente @firma móvil.
 Autofirma.
CARGA DEL CLIENTE DE FIRMA NATIVO (AUTOFIRMA /
CLIENTE @FIRMA MÓVIL)
 Es posible saltarse el intento de ejecución del MiniApplet @firma y lanzar
directamente la aplicación nativa mediante la función: :
 cargarAppAfirma(base, keystore)
 base: Ruta de despliegue del MiniApplet.
 keystore: Opcional. Almacén de certificados que debe cargarse.
 El parámetro keystore será obviado por el Cliente @firma móvil, en
donde se cargará el almacén disponible para su sistema.
 La invocación de Autofirma por parte de los navegadores web pueden
implicar en mensaje de confirmación que el usuario deberá aceptar para
la ejecución de la aplicación.
 Es responsabilidad de los integradores advertir a los usuarios de la
necesidad de tener instalada AutoFirma y que se permita su ejecución.
AGENDA
Uso del
MiniApplet
FUNCIONES DE OPERACIÓN
 String sign(dataB64, algorithm, format, extraParams,
successCallback, errorCalback)
– Firma datos.
 String coSign(signB64, dataB64, algorithm, format,
extraParams, successCallback, errorCalback)
– Cofirma una firma.
 String counterSign(signB64, algorithm, format,
extraParams, successCallback, errorCalback)
– Contrafirma una firma.
 void signBatch(batchB64, preSignerUrl, postSignerUrl,
params , successCallback, errorCalback)
– Ejecuta un proceso de firma de lote.
 boolean saveDataToFile(dataB64, title, filename,
extension, description)
– Guarda datos a disco.
FUNCIONES DE CONFIGURACIÓN
 void setStickySignatory(sticky)
– Fija el certificado firmante.
 void setServlets(storageServlet, retrieveServlet)
– Establece la ruta de los servicios de guardado y recuperación de
datos para la comunicación bidireccional con aplicaciones nativas.
 void checkTime (checkType, maxMillis)
– Compara la hora local y la del sistema. Se puede notificar al usuario
que cambie la hora de su PC si existe un desfase e incluso impedir
la carga del applet si este existe.
 void setLocale (locale)
– Establece la localización que se debe usar, para que el applet
muestre los mensajes en el idioma oportuno si los tiene disponibles.
FUNCIONES DE UTILIDAD
 String getBase64FromText(plainText, charset)
– Codifica a base64.
 String getTextFromBase64(base64Data, charset)
– Descodifica un base64.
 String getFileNameContentBase64(title, extensions,
description)
– Carga un fichero. El resultado tiene la forma: path|base64
 String[] getMultiFileNameContentBase64(title,
extensions, description)
– Carga múltiples ficheros. El resultado tiene la forma: path|base64
 String getTextFromBase64(base64Data, charset)
– Descodifica un base64.
FUNCIONES DE COMPROBACIÓN DE ENTORNO
 void echo()
– Muestra un mensaje por consola.
 boolean isAndroid()
– Indica si el sistema operativo es Google Android.
 boolean isIOS()
– Indica si el sistema operativo es Apple iOS.
FUNCIONES DE GESTIÓN DE ERRORES Y DEPURACIÓN
 String getErrorType()
– Recupera el tipo de error producido.
 String getErrorMessage()
– Recupera el texto descriptivo del error.
 String getCurrentLog()
– Obtiene las trazas de ejecución de la aplicación.
 Ejemplo de gestión de errores:
var resultField = document.getElementById("b64signature");
try {
var plainText = document.getElementById("plaintext").value;
var dataB64 = MiniApplet.getBase64FromText(plainText, "UTF-8");
var signature = MiniApplet.sign(dataB64, "SHA1withRSA", "CAdES",
"mode=implicitnexpPolicy=FirmaAGE");
resultField.value = signature;
} catch(e) {
if (MiniApplet.getErrorType() != "es.gob.afirma.core.AOCancelledOperationException") {
resultField.value = MiniApplet.getErrorMessage();
} else {
alert("Error:n" + MiniApplet.getCurrentLog());
}
}
MINIAPPLET VS APPLET CLIENTE
 El almacén de certificados sólo puede modificarse durante la carga.
 Todos las opciones de configuración de una operación se proporcionan
como parámetros de la función que la ejecuta.
 El resultado de las operaciones se obtiene como valor de retorno de la
operación o a través de una función callback.
 Siempre se opera sobre datos en memoria.
 Cualquier selección de fichero (carga o guardado) debe realizarla el
usuario.
 Sistema de filtro de certificados predefinidos.
 Expansión de variables de configuración.
 La gestión de errores se realiza mediante excepciones o funciones
callback.
AGENDA
Filtros de certificados
FILTROS DE CERTIFICADOS
 El MiniApplet incluye filtros preconfigurados que permiten filtrar los
certificados por diversos criterios.
 Los filtros se configuran a través de las siguientes propiedades que se
pueden agregar a los extraParams de una operación de firma:
 filter ó filters
 Establece el listado completo de filtros que debe cumplir cada certificado para
aparecer en el diálogo de selección.
 Los distintos filtros se concatenan con el carácter punto y coma (';').
 filters.X
 X es un número la serie de números naturales (empezando en 1).
 Cada propiedad establece uno de los posibles listados de filtros que debe cumplir
un certificado para aparecer en el diálogo de selección.
 Basta con cumplir los filtros de un listado para aparecer.
 Para evitar que se muestre el diálogo de selección cuando sólo haya un
certificado que mostrar se puede incluir la propiedad headless con el
valor true.
FILTROS DE CERTIFICADOS
 Los filtros actualmente soportados por el MiniApplet son:
 nonexpired: Muestra sólo los certificados no caducados.
 sscd: Muestra los certificados expedidos expresamente para tarjeta
inteligente.
 thumbprint: Permite indicar en base 64 la huella digital del certificado que
se desea mostrar.
 ssl: Permite establecer el SerialNumber en hexadecimal del certificado que
se desea mostrar.
 qualified: Evolución del anterior que tendría en cuenta si el certificado es
de autenticación y hay uno de firma asociado.
 dnie: Sólo mostrará los certificados de firma de DNIe.
 signingcert: Muestra todos los certificados salvo el de autenticación del
DNIe.
 authcert: Muestra todos los certificados salvo el de firma del DNIe.
FILTROS DE CERTIFICADOS
 Más filtros:
 Filtro por KeyUsage que permite establecer si los keyusages particulares del
certificado deben estar establecidos o no:
 keyusage.digitalsignature
 keyusage.nonrepudiation
 keyusage.keyencipherment
 keyusage.dataencipherment
 keyusage.keyagreement
 keyusage.keycertsign
 keyusage.crlsign
 keyusage.encipheronly
 keyusage.decipheronly
FILTROS DE CERTIFICADOS
 Más filtros:
 subject.rfc2254: Establece un filtro según la RFC 2254 que debe cumplir
el Subject del certificado.
 issuer.rfc2254: Establece un filtro según la RFC 2254 que debe cumplir
el Issuer del certificado.
 subject.contains: Establece un texto que debe estar contenido en el
principal del subject del certificado.
 Ignora mayúsculas y minúsculas.
 issuer.contains: Establece un texto que debe estar contenido en el
principal del issuer del certificado.
 Ignora mayúsculas y minúsculas.
FILTRO RFC2254
 Filtros conforme al estándar RFC2254.
 Implementados en el paquete: afirma-keystores-filters-rfc
 Sintaxis:
 Sentencias entre paréntesis.
 Comprobación del valor de RDN con '=': (c=ES)
 El comodín de cadenas es '*': (ou=Metro*)
 Caracteres especiales con Unicode: (cn=*28FIRMA29*)
 Negación con '!' delante de la expresión: (!(o=*FNMT*))
 Condición conjuntiva con '&': (&(l=Madrid)(c=ES))
 Condición disyuntiva con '|': (|(o=DIRECCION GENERAL DE LA
POLICIA)(o=FNMT))
AGENDA
Firma por lotes
FIRMA POR LOTES CON EL MINIAPPLET
 Proceso de firma de múltiples datos como una única operación.
 Se definen todos los datos sobre los que se deberá operar en el inicio de
la operación.
 Operación única para el lote, pero configuración separada para cada
operación individual.
 Está orientado a reducir en la medida de lo posible la interacción con el
usuario.
 Especialmente útil cuando el origen y el destino de los datos es un
servidor remoto, con lo que se combina con la firma trifásica.
 Permite trabajar con lotes completos de datos (se firma todo el lote o no
se firma nada, caso común en los portafirmas).
FIRMA POR LOTES CON EL MINIAPPLET
 XML de ejemplo:
<?xml version="1.0" encoding="UTF-8"?>
<signbatch stoponerror="false" algorithm="SHA512withRSA">
<singlesign Id="1234">
<datasource>dataB64</datasource>
<format>CAdES</format>"
<suboperation>sign</suboperation>
<extraparams>extraParamsB64</extraparams>
<signsaver>
<class>es.gob.afirma.signers.batch.SignSaverFile</class>
<config>configB64</config>
</signsaver>
</singlesign>
…
</signbatch>
AGENDA
Uso del Cliente @firma
por otras aplicaciones
USO DEL CLIENTE @FIRMA POR OTRAS APLICACIONES
 El Cliente @firma lo conforman por un conjunto de bibliotecas Java (en su
gran mayoría).
 Las funcionalidades de estas bibliotecas (JAR) pueden ser usadas por
otras aplicaciones Java de escritorio o en servidor.
 Podemos distinguir entre 2 casos principales cuando queremos utilizar el
Cliente @firma desde otra aplicación:
 Aplicaciones construidas mediante Maven.
 El resto de aplicaciones.
 En las aplicaciones construidas con Maven podemos agregar los módulos
que nos interesen del Cliente @firma al pom.xml del nuevo proyecto.
 En el resto de aplicaciones podemos agregar los JAR del proyecto que
deseemos como bibliotecas de la nueva herramienta.
USO DEL CLIENTE @FIRMA POR OTRAS APLICACIONES
 En las aplicaciones maven agregaremos al pom.xml del proyecto:
 Repositorio del que obtener los módulos:
<repositories>
<repository>
<id>uji</id>
<url>http://devel.uji.es/nexus/content/groups/public/</url>
</repository>
</repositories>
 Listado de módulos:
<dependencies>
<dependency>
<groupId>es.gob.afirma</groupId>
<artifactId>id_modulo</artifactId>
</dependency>
…
</dependencies>
USO DEL CLIENTE @FIRMA POR OTRAS APLICACIONES
 En las aplicaciones que no utilicen maven podremos utilizar directamente
los JAR de los módulos como bibliotecas del proyecto.
 Si queremos simplificar, podemos agregar el JAR completo de una de las
aplicaciones construidas del Cliente @firma.
 Applet Cliente @firma
 Cuenta con todos los módulos cliente del proyecto.
 MiniApplet @firma
 Incluye los módulos de firma y acceso a los repositorios de claves.
 StandAlone
 Cuenta con todos los módulos del proyecto, excepto filtros de certificados.
 AutoFirma
 Incluye los módulos de firma y acceso a los repositorios de claves , excepto filtros
de certificados.
 Los applets se distribuyen ofuscados para reducir su tamaño, por lo que será
necesario compilarlos omitiendo la operación de ofuscación.
AGENDA
Clases de interés
ACCESO A ALMACENES DE CLAVES Y CERTIFICADOS
 Módulos relevantes:
 afirma-core-keystores
 Acceso a los almacenes de claves de Windows y Mac OS X, almacenes PKCS#12
y JKS y tarjetas (PKCS#11).
 afirma-keystores-mozilla
 Acceso al almacén de Mozilla Firefox.
 jmulticard-jse
 Uso del DNIe sin drivers.
 Clases principales para el uso de los almacenes y certificados:
 es.gob.afirma.keystores.AOKeyStore
 es.gob.afirma.keystores.AOKeyStoreManagerFactory
 es.gob.afirma.keystores.AOKeyStoreManager
 es.gob.afirma.keystores.filters.CertificateFilter
AOKeyStore
 Enumerado con comportamiento y los almacenes de certificados
soportados por el módulo.
 Contiene los valores:
 WINDOWS
 APPLE
 MOZ_UNI
 PKCS12
 JAVA
 PKCS11
 Contiene los métodos relevantes:
 PasswordCallback getStorePasswordCallback(Object parent)
 PasswordCallback getCertificatePasswordCallback(Object
parent)
AOKeyStoreManagerFactory
 Factoría para la obtención de los manejadores de para cada uno de los
almacenes de certificados.
 Método para la obtención del manejador:
 static AOKeyStoreManager getAOKeyStoreManager(AOKeyStore store, String lib,
String description, PasswordCallback pssCallback, Object parentComponent)
 Ejemplo:
// Creamos el PasswordCallback para la obtencion de la contrasena
UIPasswordCallback psc = new UIPasswordCallback(
"Contraseu00F1a del almacén PKCS#12 seleccionado", this.parent);
// Obtenemos el manejador para un almacen en fichero local de tipo PKCS12
AOKeyStoreManager ksm = AOKeyStoreManagerFactory.getAOKeyStoreManager(
AOKeyStore.PKCS12,
"/ruta/almacen.pfx",
"Almacu00E9n PKCS#12 local",
psc,
this.parent);
AOKeyStoreManager
 Manejador para la gestión de un almacén de certificados.
 Métodos de interés:
 String[] getAliases()
 X509Certificate getCertificate(String alias)
 X509Certificate[] getCertificateChain(String alias)
 KeyStore.PrivateKeyEntry getKeyEntry(String alias)
 void refresh()
 Ejemplo:
// Recuperamos los alias y a partir del primero de ellos la referencia a
// clave privada
PrivateKeyEntry scKeyEntry = null;
String[] aliases = ksm.getAliases();
if (aliases.length > 0) {
scKeyEntry = ksm.getKeyEntry(aliases[0]);
}
CertificateFilter
 Clase abstracta de la que debe heredar un filtro de certificados.
 Existen varios filtros de certificados implementados:
– Filtros RFC2254.
– Filtros por KeyUsage.
– Filtro de certificado de firma del DNIe.
– Filtro de certificados SSCD.
– Filtro por número de serie del certificado.
– Filtro de certificados caducados.
– Etc.
 Métodos que declara:
– boolean matches(X509Certificate cert)
– String[] matches(String[] aliases, AOKeyStoreManager ksm)
MÓDULOS DE FIRMA
 Los módulos de firma incorporan al Cliente la compatibilidad con nuevos
formatos de firma electrónica.
 Los manejadores de firma de estos módulos implementan la interfaz:
 es.gob.afirma.core.signers.AOSigner
 Existen manejadores para los formatos:
 CAdES
 ASiC-CAdES
 XAdES
 ASiC-XAdES
 Factura-e
 PAdES
 ODF
 OOXML
 La gestión de los manejadores de firma se realiza a través de la
clase:
 es.gob.afirma.core.signers.AOSignerFactory
AOSigner
 Definen los métodos para la gestión de las firmas:
– byte[] sign(byte[] data, String algorithm, PrivateKey pk,
Certificate[] certChain, Properties extraParams)
– byte[] cosign(byte[] sign, String algorithm, PrivateKey
pk, Certificate[] certChain, Properties extraParams)
– byte[] cosign(byte[] data, byte[] sign, String algorithm,
PrivateKey pk, Certificate[] certChain, Properties
extraParams)
– byte[] countersign(byte[] sign, String algorithm,
CounterSignTarget targetType, Object[] targets,
PrivateKey pk, Certificate[] certChain, Properties
extraParams)
– boolean isValidDataFile(byte[] data)
– boolean isSign(byte[] data)
– byte[] getData(byte[] signData)
– String getSignedName(String originalName, String inText)
AOSigner
 Ejemplo de firma:
 Ejemplo de cofirma:
// Instanciamos el manejador de firmas PAdES incluido en el módulo afirma-crypto-pdf
AOSigner signer = new AOPDFSigner();
if (!signer.isValidDataFile(data)) {
throw new IllegalArgumentException("No se ha introducido un documento PDF valido");
}
byte[] signedPDF = signer.sign(data, AOSignConstants.SIGN_ALGORITHM_SHA512WITHRSA, keyEntry.getPrivateKey(),
keyEntry.getCertificateChain(), null);
// Instanciamos el manejador de firmas CAdES incluido en los módulos afirma-crypto-cades y afirma-crypto-
cades-multi
AOSigner signer = new AOCAdESSigner();
if (!signer.isSign(data)) {
throw new IllegalArgumentException("No se ha introducido una firma CAdES valida");
}
if (signer.getData() == null) {
throw new IllegalArgumentException("La firma indicada no tiene los datos firmados incluidos");
}
byte[] cosignature = signer.cosign(data, AOSignConstants.SIGN_ALGORITHM_SHA512WITHRSA,
keyEntry.getPrivateKey(), keyEntry.getCertificateChain(), null);
AOSignerFactory
 Factoría con la obtener los distintos módulos de firma:
– static AOSigner getSigner(String signFormat)
• Recupera el manejador de firma para un formato dado.
– static AOSigner getSigner(byte[] signData)
• Recupera el manejador de firma capaz de tratar firmas como la indicada.
 Ejemplo:
byte[] cosignature = null;
// Cofirmamos en el mismo formato en el que esta firmada
AOSigner signer = AOSignerFactory.getSigner(signature);
if (signer != null) {
cosignature = signer.cosign(
signature, // Firma
AOSignConstants.SIGN_ALGORITHM_SHA1WITHRSA, // Algoritmo
pke.getPrivateKey(), // Referencia a la clave privada del certificado
pke.getCertificateChain(), // Cadena de certificacion
null // Propiedades extra de configuración
);
}
FUNCIONES DE UTILIDAD
 En los módulos del Cliente se encuentran clases con funciones de utilidad
para las distintas operaciones que debe realizar.
 Un integrador/desarrollador puede utilizarlas para integrar el Cliente a
bajo nivel, desarrollar nuevas funcionalidades o valerse de ellas para su
uso por una aplicación externa.
 Las principales clases de utilidad son:
 AOUtil
 AOSignConstants
 Base64
 MimeHelper
 AOUIFactory
AOUtil
 Utilidades de uso general.
– static URI createURI(String file)
• Crea una URI a partir de una ruta (local o remota).
– static InputStream loadFile(URI uri)
• Abre un flujo de datos a partir de una URI.
– static byte[] getDataFromInputStream(InputStream input)
• Carga los datos de un flujo de datos de entrada.
– static boolean copyFile(File source, File dest)
• Copia el contenido de un fichero a otro.
– static String getCN(X509Certificate c)
• Obtiene el nombre común (o el más descriptivo) de un certificado.
– static String getCN(String principal)
• Obtiene el nombre común (o el más descriptivo) de un nombre X500.
AOSignConstants
 Clase con constantes de firma:
– Nombres de formatos de firma
• SIGN_FORMAT_CADES, SIGN_FORMAT_FACTURAE, SIGN_FORMAT_PADES,
etc.
– Nombres de algoritmos de firma
• SIGN_ALGORITHM_SHA1WITHRSA, SIGN_ALGORITHM_SHA512WITHRSA, etc.
– Nombres de modos de firma
• SIGN_MODE_IMPLICIT / SIGN_MODE_EXPLICIT
– Nombre de operaciones masivas
• MASSIVE_OPERATION_SIGN, MASSIVE_OPERATION_COUNTERSIGN_LEAFS,
etc.
– Nombres de estructuras de firma
• CMS_CONTENTTYPE_SIGNEDDATA, CMS_CONTENTTYPE_ENVELOPEDDATA,
etc.
– Nombres de configuraciones por defecto
• DEFAULT_SIGN_FORMAT, DEFAULT_MASSIVE_OPERATION,
DEFAULT_CMS_CONTENTTYPE, etc.
AOBase64
 Clase para la conversión de datos Base64:
– Conversión de datos a base 64
• static String encode(byte[] source )
– Decodificación de datos base 64
• static byte[] decode( String s )
 Admite Base 64 "URL Safe".
 Admite compresión de datos.
MimeHelper
 Clase para la identificación de formatos de datos.
 Métodos de interés:
– MimeHelper(byte[] data)
• Construye un objeto para el análisis de los datos.
– String getMimeType()
• Devuelve el MimeType de los datos.
– String getExtension()
• Recupera la extensión asidua para un fichero con este tipo de datos.
– static String transformMimeTypeToOid(String mimetype)
• Obtiene el OID asociado a un MimeType concreto.
– static String transformOidToMimeType(String oid)
• Obtiene el MimeType asociado a un OID concreto.
AOUIFactory
 Factoría para la creación de interfaces gráficas.
 Requiere del módulo "afirma-ui-core-jse" u otra implementación.
 Los métodos principales son:
– static File getLoadFile(String dialogTitle, String
currentDir, String fileName, String[] extensions, String
description, boolean selectDirectory , boolean
multiSelect, Object icon, Object parent)
– static File getSaveDataToFile(byte[] data, String
dialogTitle, String currentDir, String fileName, File
selectedFile, String[] exts, String description, Object
parent)
– static char[] getPassword(String text, Object parent)

Contenu connexe

Tendances

D andoni perez_de_lema_-_igae_-_optimizacion_de_la_calidad_de_servicio_y_la_e...
D andoni perez_de_lema_-_igae_-_optimizacion_de_la_calidad_de_servicio_y_la_e...D andoni perez_de_lema_-_igae_-_optimizacion_de_la_calidad_de_servicio_y_la_e...
D andoni perez_de_lema_-_igae_-_optimizacion_de_la_calidad_de_servicio_y_la_e...clienteafirma
 
Intro a ASP.NET
Intro a ASP.NETIntro a ASP.NET
Intro a ASP.NETwilliamsm
 
Introducción ASP .NET
Introducción ASP .NET Introducción ASP .NET
Introducción ASP .NET Universidad
 
Microsoft Asp. Net [Asp.Net - Parte 2]
Microsoft Asp. Net [Asp.Net - Parte 2]Microsoft Asp. Net [Asp.Net - Parte 2]
Microsoft Asp. Net [Asp.Net - Parte 2]Antonio Torres
 
Análisis de clientes ICA
Análisis de clientes ICAAnálisis de clientes ICA
Análisis de clientes ICAJoaquin Herrero
 

Tendances (12)

D andoni perez_de_lema_-_igae_-_optimizacion_de_la_calidad_de_servicio_y_la_e...
D andoni perez_de_lema_-_igae_-_optimizacion_de_la_calidad_de_servicio_y_la_e...D andoni perez_de_lema_-_igae_-_optimizacion_de_la_calidad_de_servicio_y_la_e...
D andoni perez_de_lema_-_igae_-_optimizacion_de_la_calidad_de_servicio_y_la_e...
 
ASP.NET
ASP.NETASP.NET
ASP.NET
 
Intro a ASP.NET
Intro a ASP.NETIntro a ASP.NET
Intro a ASP.NET
 
Introducción ASP .NET
Introducción ASP .NET Introducción ASP .NET
Introducción ASP .NET
 
Microsoft Asp. Net [Asp.Net - Parte 2]
Microsoft Asp. Net [Asp.Net - Parte 2]Microsoft Asp. Net [Asp.Net - Parte 2]
Microsoft Asp. Net [Asp.Net - Parte 2]
 
1. Introduccion A Asp .Net
1.  Introduccion A Asp .Net1.  Introduccion A Asp .Net
1. Introduccion A Asp .Net
 
Análisis de clientes ICA
Análisis de clientes ICAAnálisis de clientes ICA
Análisis de clientes ICA
 
Citrix Web Interface
Citrix Web InterfaceCitrix Web Interface
Citrix Web Interface
 
Asp.net
Asp.netAsp.net
Asp.net
 
Fop2 en un contact center
Fop2 en un contact centerFop2 en un contact center
Fop2 en un contact center
 
Citrix Secure Gateway
Citrix Secure GatewayCitrix Secure Gateway
Citrix Secure Gateway
 
Integrando voz (rtmp) con fop2
Integrando voz (rtmp) con fop2Integrando voz (rtmp) con fop2
Integrando voz (rtmp) con fop2
 

Similaire à 2015 10 - Curso Cliente @firma INAP día 2

Similaire à 2015 10 - Curso Cliente @firma INAP día 2 (20)

Servicio web
Servicio web Servicio web
Servicio web
 
Webutil
WebutilWebutil
Webutil
 
Webutil
WebutilWebutil
Webutil
 
Webutil 090812113116-phpapp01
Webutil 090812113116-phpapp01Webutil 090812113116-phpapp01
Webutil 090812113116-phpapp01
 
Servicios web
Servicios webServicios web
Servicios web
 
DotNetDom: El futuro de Xamarin
DotNetDom: El futuro de XamarinDotNetDom: El futuro de Xamarin
DotNetDom: El futuro de Xamarin
 
Airbase y KARMetasploit
Airbase y KARMetasploitAirbase y KARMetasploit
Airbase y KARMetasploit
 
Tecnologías para microservicios
Tecnologías para microserviciosTecnologías para microservicios
Tecnologías para microservicios
 
presenjava.ppt
presenjava.pptpresenjava.ppt
presenjava.ppt
 
SimpleSAMLphp
SimpleSAMLphpSimpleSAMLphp
SimpleSAMLphp
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Actividad4 manual usuarrio _victor jaimes
Actividad4 manual usuarrio _victor jaimesActividad4 manual usuarrio _victor jaimes
Actividad4 manual usuarrio _victor jaimes
 
Servicios web
Servicios webServicios web
Servicios web
 
Deletreando Android
Deletreando AndroidDeletreando Android
Deletreando Android
 
2. Java Servlets (J2EE) - Curso 2005-2006
2. Java Servlets (J2EE) - Curso 2005-20062. Java Servlets (J2EE) - Curso 2005-2006
2. Java Servlets (J2EE) - Curso 2005-2006
 
Testing Android Security
Testing Android SecurityTesting Android Security
Testing Android Security
 
Codemotion 2013 - Quiero tiempo real y lo quiero para ayer
Codemotion 2013 - Quiero tiempo real y lo quiero para ayerCodemotion 2013 - Quiero tiempo real y lo quiero para ayer
Codemotion 2013 - Quiero tiempo real y lo quiero para ayer
 

Plus de Tomás García-Merás

NWC10 - Retos digitales derivados del COVID-19
NWC10 - Retos digitales derivados del COVID-19NWC10 - Retos digitales derivados del COVID-19
NWC10 - Retos digitales derivados del COVID-19Tomás García-Merás
 
Hacking hardware en sistemas empotrados: De la preservación a la seguridad
Hacking hardware en sistemas empotrados: De la preservación a la seguridadHacking hardware en sistemas empotrados: De la preservación a la seguridad
Hacking hardware en sistemas empotrados: De la preservación a la seguridadTomás García-Merás
 
Blockchain vs. Firma electrónica en sector público
Blockchain vs. Firma electrónica en sector públicoBlockchain vs. Firma electrónica en sector público
Blockchain vs. Firma electrónica en sector públicoTomás García-Merás
 
T3chfest 2019 - Modelos de confianza técnico-jurídica en Blockchain
T3chfest 2019 - Modelos de confianza técnico-jurídica en BlockchainT3chfest 2019 - Modelos de confianza técnico-jurídica en Blockchain
T3chfest 2019 - Modelos de confianza técnico-jurídica en BlockchainTomás García-Merás
 
Confidencialidad de los datos en la cadena de bloques
Confidencialidad de los datos en la cadena de bloquesConfidencialidad de los datos en la cadena de bloques
Confidencialidad de los datos en la cadena de bloquesTomás García-Merás
 
CyberCamp 2018 - La autenticación con certificados en las Sedes Electrónicas
CyberCamp 2018 - La autenticación con certificados en las Sedes ElectrónicasCyberCamp 2018 - La autenticación con certificados en las Sedes Electrónicas
CyberCamp 2018 - La autenticación con certificados en las Sedes ElectrónicasTomás García-Merás
 
Mitos y realidades de la confianza en Blockchain
Mitos y realidades de la confianza en BlockchainMitos y realidades de la confianza en Blockchain
Mitos y realidades de la confianza en BlockchainTomás García-Merás
 
Asegurando los API con Criptografía RSA: Más allá del SSL
Asegurando los API con Criptografía RSA: Más allá del SSLAsegurando los API con Criptografía RSA: Más allá del SSL
Asegurando los API con Criptografía RSA: Más allá del SSLTomás García-Merás
 
Desarrollo Java en PlayStation: Aplicaciones en disco para usos atípicos
Desarrollo Java en PlayStation: Aplicaciones en disco para usos atípicosDesarrollo Java en PlayStation: Aplicaciones en disco para usos atípicos
Desarrollo Java en PlayStation: Aplicaciones en disco para usos atípicosTomás García-Merás
 
Programación y uso de tarjetas criptográficas NFC (DNIe, TUI, etc) con Android
Programación y uso de tarjetas criptográficas NFC (DNIe, TUI, etc) con AndroidProgramación y uso de tarjetas criptográficas NFC (DNIe, TUI, etc) con Android
Programación y uso de tarjetas criptográficas NFC (DNIe, TUI, etc) con AndroidTomás García-Merás
 
Presentación firma electrónica Codemotion 2014
Presentación firma electrónica Codemotion 2014Presentación firma electrónica Codemotion 2014
Presentación firma electrónica Codemotion 2014Tomás García-Merás
 
Uso de la firma en la AEAT (AEAT) - II Encuentro nacional sobre firma y admin...
Uso de la firma en la AEAT (AEAT) - II Encuentro nacional sobre firma y admin...Uso de la firma en la AEAT (AEAT) - II Encuentro nacional sobre firma y admin...
Uso de la firma en la AEAT (AEAT) - II Encuentro nacional sobre firma y admin...Tomás García-Merás
 
El papel de la firma electrónica en la administración (UAM) - II Encuentro na...
El papel de la firma electrónica en la administración (UAM) - II Encuentro na...El papel de la firma electrónica en la administración (UAM) - II Encuentro na...
El papel de la firma electrónica en la administración (UAM) - II Encuentro na...Tomás García-Merás
 
El papel de la firma electrónica en la administración (MinHAP-SEAP) - II Encu...
El papel de la firma electrónica en la administración (MinHAP-SEAP) - II Encu...El papel de la firma electrónica en la administración (MinHAP-SEAP) - II Encu...
El papel de la firma electrónica en la administración (MinHAP-SEAP) - II Encu...Tomás García-Merás
 
Autenticación biométrica de firma manuscrita sobre dispositivos móviles de ca...
Autenticación biométrica de firma manuscrita sobre dispositivos móviles de ca...Autenticación biométrica de firma manuscrita sobre dispositivos móviles de ca...
Autenticación biométrica de firma manuscrita sobre dispositivos móviles de ca...Tomás García-Merás
 
Nuevos retos en la gestion de la identidad digital para la nueva generación d...
Nuevos retos en la gestion de la identidad digital para la nueva generación d...Nuevos retos en la gestion de la identidad digital para la nueva generación d...
Nuevos retos en la gestion de la identidad digital para la nueva generación d...Tomás García-Merás
 
Cyber threat intelligence program (Microsoft) - II Encuentro nacional sobre f...
Cyber threat intelligence program (Microsoft) - II Encuentro nacional sobre f...Cyber threat intelligence program (Microsoft) - II Encuentro nacional sobre f...
Cyber threat intelligence program (Microsoft) - II Encuentro nacional sobre f...Tomás García-Merás
 
Certificados electrónicos en dispositivos móviles (FNMT-RCM) - II Encuentro n...
Certificados electrónicos en dispositivos móviles (FNMT-RCM) - II Encuentro n...Certificados electrónicos en dispositivos móviles (FNMT-RCM) - II Encuentro n...
Certificados electrónicos en dispositivos móviles (FNMT-RCM) - II Encuentro n...Tomás García-Merás
 
Firma electrónica manuscrita (StepOver) - II Encuentro nacional sobre firma y...
Firma electrónica manuscrita (StepOver) - II Encuentro nacional sobre firma y...Firma electrónica manuscrita (StepOver) - II Encuentro nacional sobre firma y...
Firma electrónica manuscrita (StepOver) - II Encuentro nacional sobre firma y...Tomás García-Merás
 

Plus de Tomás García-Merás (20)

NWC10 - Retos digitales derivados del COVID-19
NWC10 - Retos digitales derivados del COVID-19NWC10 - Retos digitales derivados del COVID-19
NWC10 - Retos digitales derivados del COVID-19
 
Hacking hardware en sistemas empotrados: De la preservación a la seguridad
Hacking hardware en sistemas empotrados: De la preservación a la seguridadHacking hardware en sistemas empotrados: De la preservación a la seguridad
Hacking hardware en sistemas empotrados: De la preservación a la seguridad
 
Blockchain vs. Firma electrónica en sector público
Blockchain vs. Firma electrónica en sector públicoBlockchain vs. Firma electrónica en sector público
Blockchain vs. Firma electrónica en sector público
 
T3chfest 2019 - Modelos de confianza técnico-jurídica en Blockchain
T3chfest 2019 - Modelos de confianza técnico-jurídica en BlockchainT3chfest 2019 - Modelos de confianza técnico-jurídica en Blockchain
T3chfest 2019 - Modelos de confianza técnico-jurídica en Blockchain
 
Confidencialidad de los datos en la cadena de bloques
Confidencialidad de los datos en la cadena de bloquesConfidencialidad de los datos en la cadena de bloques
Confidencialidad de los datos en la cadena de bloques
 
CyberCamp 2018 - La autenticación con certificados en las Sedes Electrónicas
CyberCamp 2018 - La autenticación con certificados en las Sedes ElectrónicasCyberCamp 2018 - La autenticación con certificados en las Sedes Electrónicas
CyberCamp 2018 - La autenticación con certificados en las Sedes Electrónicas
 
Mitos y realidades de la confianza en Blockchain
Mitos y realidades de la confianza en BlockchainMitos y realidades de la confianza en Blockchain
Mitos y realidades de la confianza en Blockchain
 
Madres Digitales 2017
Madres Digitales 2017Madres Digitales 2017
Madres Digitales 2017
 
Asegurando los API con Criptografía RSA: Más allá del SSL
Asegurando los API con Criptografía RSA: Más allá del SSLAsegurando los API con Criptografía RSA: Más allá del SSL
Asegurando los API con Criptografía RSA: Más allá del SSL
 
Desarrollo Java en PlayStation: Aplicaciones en disco para usos atípicos
Desarrollo Java en PlayStation: Aplicaciones en disco para usos atípicosDesarrollo Java en PlayStation: Aplicaciones en disco para usos atípicos
Desarrollo Java en PlayStation: Aplicaciones en disco para usos atípicos
 
Programación y uso de tarjetas criptográficas NFC (DNIe, TUI, etc) con Android
Programación y uso de tarjetas criptográficas NFC (DNIe, TUI, etc) con AndroidProgramación y uso de tarjetas criptográficas NFC (DNIe, TUI, etc) con Android
Programación y uso de tarjetas criptográficas NFC (DNIe, TUI, etc) con Android
 
Presentación firma electrónica Codemotion 2014
Presentación firma electrónica Codemotion 2014Presentación firma electrónica Codemotion 2014
Presentación firma electrónica Codemotion 2014
 
Uso de la firma en la AEAT (AEAT) - II Encuentro nacional sobre firma y admin...
Uso de la firma en la AEAT (AEAT) - II Encuentro nacional sobre firma y admin...Uso de la firma en la AEAT (AEAT) - II Encuentro nacional sobre firma y admin...
Uso de la firma en la AEAT (AEAT) - II Encuentro nacional sobre firma y admin...
 
El papel de la firma electrónica en la administración (UAM) - II Encuentro na...
El papel de la firma electrónica en la administración (UAM) - II Encuentro na...El papel de la firma electrónica en la administración (UAM) - II Encuentro na...
El papel de la firma electrónica en la administración (UAM) - II Encuentro na...
 
El papel de la firma electrónica en la administración (MinHAP-SEAP) - II Encu...
El papel de la firma electrónica en la administración (MinHAP-SEAP) - II Encu...El papel de la firma electrónica en la administración (MinHAP-SEAP) - II Encu...
El papel de la firma electrónica en la administración (MinHAP-SEAP) - II Encu...
 
Autenticación biométrica de firma manuscrita sobre dispositivos móviles de ca...
Autenticación biométrica de firma manuscrita sobre dispositivos móviles de ca...Autenticación biométrica de firma manuscrita sobre dispositivos móviles de ca...
Autenticación biométrica de firma manuscrita sobre dispositivos móviles de ca...
 
Nuevos retos en la gestion de la identidad digital para la nueva generación d...
Nuevos retos en la gestion de la identidad digital para la nueva generación d...Nuevos retos en la gestion de la identidad digital para la nueva generación d...
Nuevos retos en la gestion de la identidad digital para la nueva generación d...
 
Cyber threat intelligence program (Microsoft) - II Encuentro nacional sobre f...
Cyber threat intelligence program (Microsoft) - II Encuentro nacional sobre f...Cyber threat intelligence program (Microsoft) - II Encuentro nacional sobre f...
Cyber threat intelligence program (Microsoft) - II Encuentro nacional sobre f...
 
Certificados electrónicos en dispositivos móviles (FNMT-RCM) - II Encuentro n...
Certificados electrónicos en dispositivos móviles (FNMT-RCM) - II Encuentro n...Certificados electrónicos en dispositivos móviles (FNMT-RCM) - II Encuentro n...
Certificados electrónicos en dispositivos móviles (FNMT-RCM) - II Encuentro n...
 
Firma electrónica manuscrita (StepOver) - II Encuentro nacional sobre firma y...
Firma electrónica manuscrita (StepOver) - II Encuentro nacional sobre firma y...Firma electrónica manuscrita (StepOver) - II Encuentro nacional sobre firma y...
Firma electrónica manuscrita (StepOver) - II Encuentro nacional sobre firma y...
 

2015 10 - Curso Cliente @firma INAP día 2

  • 1. Módulo 2: Usando el Cliente @firma Presentación Ministerio de Hacienda y Administraciones Públicas
  • 2. AGENDA  La forja del Cliente @firma  Integración de los applets @firma  Despliegue y carga del MiniApplet  Uso de los applets @firma  Filtros de certificados  Uso del Cliente @firma por otras aplicaciones  Clases de interés
  • 3. La forja del Cliente @firma AGENDA
  • 4.  El proyecto Cliente @Firma está alojado en:  Forja del CTT  Descargas (Binarios, fuentes, documentación,…)  Repositorio SVN con el código del proyecto.  Foros  Listas de correo.  GitHub  Repositorio GIT con el código del proyecto  Los binarios se construyen mediante Maven.  El repositorio Maven con los artefactos se encuentra en los repositorios de la Universidad Jaume I. LA FORJA DEL CLIENTE @FIRMA
  • 5.  La construcción de los binarios del proyecto y el uso de estos por parte de otros proyectos se realiza mediante Maven.  Pasos a seguir:  Descargarse los proyectos desde uno de los repositorios:  El SVN del CTT.  GitHub.  Construir los binarios:  mvn clean install (podemos saltar los tests con –DskipTests)  Construir los proyectos Eclipse mediante Maven:  mvn eclipse:clean eclipse:eclipse  Importar los proyectos a Eclipse. LA FORJA DEL CLIENTE @FIRMA
  • 7.  El proyecto Cliente @Firma cuenta en su suite de productos con dos applets orientados a la realización de operaciones criptográficas:  Applet Cliente @firma.  MiniApplet @firma.  Los applets del Cliente @firma están orientados a ser integrados en un flujo de trabajo web en el que realizarán las operaciones criptográficas que requiere el sistema. Se deberá definir una:  Entrada de datos: Fichero en disco, datos cargados en memoria, datos en servidor,…  Salida de datos: Fichero en disco, formulario web, servicio remoto,…  Las operaciones de los applets serán invocadas mediante llamadas JavaScript desde la interfaz web. INTRODUCCIÓN
  • 8. APPLET CLIENTE @FIRMA  Applet cliente con todas las funcionalidades de @firma:  Firma/Multifirma de datos.  Operaciones automatizadas de firma masiva.  Cifrado simétrico de datos.  Generación de sobres electrónicos.  Acceso a distintos almacenes de certificados y claves.  Características:  Interfaces de entrada/salida unificadas para todas las operaciones.  Configuración en caliente de los almacenes de certificados.  Configuración por medio de fichero de propiedades JavaScript.  Sistema de filtros de certificados completamente configurables.  Solicitud de permisos para acceso a disco  Muy extendido:  Desplegado en cientos de organismos públicos.
  • 9. MINIAPPLET @FIRMA  Applet cliente con funcionalidades de firma.  Funcionalidades:  Despliegue e integración simplificadas.  Ejecución asíncrona de las operaciones de firma.  Mejor sistema de tratamiento de errores.  Sistema de filtros de certificados simplificado.  Políticas de firma de la AGE preconfiguradas.  No dispone de funcionalidades de cifrado, generación de sobres digitales, firma masiva integrada…  Despliegue compatible con el Cliente de firma móvil.  Gran estabilidad y fiabilidad.
  • 10.  Permite que aplicaciones web hagan uso de sus funcionalidades a través de interfaces JavaScript.  Orientado a la integración en flujos de trabajo web:  Trámites web para usuarios.  Procedimientos internos (Portafirmas).  Compatibilidad dependiente del navegador web y su versión.  Sujeto a múltiples restricciones de seguridad en el entorno del usuario.  Necesitan estar firmados con un certificado de firma reconocido por el sistema.  Configurables al compilar para:  Eliminar o agregar módulos.  Suspender la ofuscación de código. CARACTERÍSTICAS DE LOS APPLETS
  • 11. AGENDA Despliegue y carga del MiniApplet
  • 12. COMPONENTES DEL MINIAPPLET  El MiniApplet @firma está compuesto por:  Un applet Java con toda la funcionalidad criptográfica.  miniapplet-full_X_Y.jar  Una biblioteca JavaScript para el despliegue y uso del applet.  miniapplet.js  Servicios externos:  Servlet de firma trifásica.  afirma-server-triphase-signer.war  Servlets para la comunicación con aplicaciones nativa.  afirma-signature-retriever.war / afirma-signature-storage.war  Para desplegarlo todo basta un simple servidor de aplicaciones (Tomcat, Jboss…)
  • 13. DESPLIEGUE DEL MINIAPPLET MEDIANTE JAVASCRIPT  La biblioteca "miniapplet.js" contiene los métodos necesarios para la carga y el uso del MiniApplet.  La invocación de los métodos del MiniApplet se realizará a partir del objeto MiniApplet.  La invocación deberá realizarse en:  Un contexto JavaScript situado en el cuerpo del documento HTML.  Un evento de la página web.  Una función invocada desde cualquiera de los sitios anteriores.
  • 14. DESPLIEGUE DEL MINIAPPLET MEDIANTE JAVASCRIPT  El método de carga del MiniApplet se encuentra en la biblioteca JavaScript "miniapplet.js":  cargarMiniApplet(base, keystore)  base: Ruta de despliegue del MiniApplet.  keystore: Opcional. Almacén de certificados que debe cargarse.  Los almacenes de certificados disponibles están en "miniapplet.js":  MiniApplet.KEYSTORE_WINDOWS  MiniApplet.KEYSTORE_FIREFOX / KEYSTORE_MOZILLA  MiniApplet.KEYSTORE_APPLE  MiniApplet.KEYSTORE_PKCS12  Seguido de ':' y la ruta del almacén.  MiniApplet.KEYSTORE_PKCS11  Seguido de ':' y la ruta de la biblioteca PKCS#11.  MiniApplet.KEYSTORE_JAVA/KEYSTORE_JCEKS/KEYSTORE_JAVACE
  • 15. COMPROBACIÓN DE CARGA  El MiniApplet incorpora el método echo() que sólo muestra información del sistema, no requiere interacción con el usuario y no puede firmar cuando el applet se carga correctamente.  Resultado de la llamada a la función:  En caso de encontrarse cargado el applet devolverá una cadena con información sobre el sistema.  En caso de que no se haya iniciado la carga del applet, por cualquier motivo, el método echo() devolverá como resultado la cadena "Cliente JavaScript".  En caso de producirse un error durante la llamada, se lanzará una excepción.  Se pueden realizar llamadas periódicas a este método a la espera de que se obtenga un resultado distinto a "Cliente JavaScript".
  • 16. CARGA DEL CLIENTE DE FIRMA NAVITO (AUTOFIRMA / CLIENTE @FIRMA MÓVIL)  Cuando no es posible cargar el MiniApplet @firma el JavaScript de despliegue delegará en una aplicación nativa la ejecución de las operaciones de firma y guardado.  Motivos por los que no se podría ejecutar el applet:  Entornos de ejecución no compatible:  Google Chrome 45 (y superiores)  Google Android  Apple iOS  Denegación de permisos por parte del usuario.  No confianza en los certificados de firma.  Etc.  Las aplicaciones nativas compatibles son:  Cliente @firma móvil.  Autofirma.
  • 17. CARGA DEL CLIENTE DE FIRMA NATIVO (AUTOFIRMA / CLIENTE @FIRMA MÓVIL)  Es posible saltarse el intento de ejecución del MiniApplet @firma y lanzar directamente la aplicación nativa mediante la función: :  cargarAppAfirma(base, keystore)  base: Ruta de despliegue del MiniApplet.  keystore: Opcional. Almacén de certificados que debe cargarse.  El parámetro keystore será obviado por el Cliente @firma móvil, en donde se cargará el almacén disponible para su sistema.  La invocación de Autofirma por parte de los navegadores web pueden implicar en mensaje de confirmación que el usuario deberá aceptar para la ejecución de la aplicación.  Es responsabilidad de los integradores advertir a los usuarios de la necesidad de tener instalada AutoFirma y que se permita su ejecución.
  • 19. FUNCIONES DE OPERACIÓN  String sign(dataB64, algorithm, format, extraParams, successCallback, errorCalback) – Firma datos.  String coSign(signB64, dataB64, algorithm, format, extraParams, successCallback, errorCalback) – Cofirma una firma.  String counterSign(signB64, algorithm, format, extraParams, successCallback, errorCalback) – Contrafirma una firma.  void signBatch(batchB64, preSignerUrl, postSignerUrl, params , successCallback, errorCalback) – Ejecuta un proceso de firma de lote.  boolean saveDataToFile(dataB64, title, filename, extension, description) – Guarda datos a disco.
  • 20. FUNCIONES DE CONFIGURACIÓN  void setStickySignatory(sticky) – Fija el certificado firmante.  void setServlets(storageServlet, retrieveServlet) – Establece la ruta de los servicios de guardado y recuperación de datos para la comunicación bidireccional con aplicaciones nativas.  void checkTime (checkType, maxMillis) – Compara la hora local y la del sistema. Se puede notificar al usuario que cambie la hora de su PC si existe un desfase e incluso impedir la carga del applet si este existe.  void setLocale (locale) – Establece la localización que se debe usar, para que el applet muestre los mensajes en el idioma oportuno si los tiene disponibles.
  • 21. FUNCIONES DE UTILIDAD  String getBase64FromText(plainText, charset) – Codifica a base64.  String getTextFromBase64(base64Data, charset) – Descodifica un base64.  String getFileNameContentBase64(title, extensions, description) – Carga un fichero. El resultado tiene la forma: path|base64  String[] getMultiFileNameContentBase64(title, extensions, description) – Carga múltiples ficheros. El resultado tiene la forma: path|base64  String getTextFromBase64(base64Data, charset) – Descodifica un base64.
  • 22. FUNCIONES DE COMPROBACIÓN DE ENTORNO  void echo() – Muestra un mensaje por consola.  boolean isAndroid() – Indica si el sistema operativo es Google Android.  boolean isIOS() – Indica si el sistema operativo es Apple iOS.
  • 23. FUNCIONES DE GESTIÓN DE ERRORES Y DEPURACIÓN  String getErrorType() – Recupera el tipo de error producido.  String getErrorMessage() – Recupera el texto descriptivo del error.  String getCurrentLog() – Obtiene las trazas de ejecución de la aplicación.  Ejemplo de gestión de errores: var resultField = document.getElementById("b64signature"); try { var plainText = document.getElementById("plaintext").value; var dataB64 = MiniApplet.getBase64FromText(plainText, "UTF-8"); var signature = MiniApplet.sign(dataB64, "SHA1withRSA", "CAdES", "mode=implicitnexpPolicy=FirmaAGE"); resultField.value = signature; } catch(e) { if (MiniApplet.getErrorType() != "es.gob.afirma.core.AOCancelledOperationException") { resultField.value = MiniApplet.getErrorMessage(); } else { alert("Error:n" + MiniApplet.getCurrentLog()); } }
  • 24. MINIAPPLET VS APPLET CLIENTE  El almacén de certificados sólo puede modificarse durante la carga.  Todos las opciones de configuración de una operación se proporcionan como parámetros de la función que la ejecuta.  El resultado de las operaciones se obtiene como valor de retorno de la operación o a través de una función callback.  Siempre se opera sobre datos en memoria.  Cualquier selección de fichero (carga o guardado) debe realizarla el usuario.  Sistema de filtro de certificados predefinidos.  Expansión de variables de configuración.  La gestión de errores se realiza mediante excepciones o funciones callback.
  • 26. FILTROS DE CERTIFICADOS  El MiniApplet incluye filtros preconfigurados que permiten filtrar los certificados por diversos criterios.  Los filtros se configuran a través de las siguientes propiedades que se pueden agregar a los extraParams de una operación de firma:  filter ó filters  Establece el listado completo de filtros que debe cumplir cada certificado para aparecer en el diálogo de selección.  Los distintos filtros se concatenan con el carácter punto y coma (';').  filters.X  X es un número la serie de números naturales (empezando en 1).  Cada propiedad establece uno de los posibles listados de filtros que debe cumplir un certificado para aparecer en el diálogo de selección.  Basta con cumplir los filtros de un listado para aparecer.  Para evitar que se muestre el diálogo de selección cuando sólo haya un certificado que mostrar se puede incluir la propiedad headless con el valor true.
  • 27. FILTROS DE CERTIFICADOS  Los filtros actualmente soportados por el MiniApplet son:  nonexpired: Muestra sólo los certificados no caducados.  sscd: Muestra los certificados expedidos expresamente para tarjeta inteligente.  thumbprint: Permite indicar en base 64 la huella digital del certificado que se desea mostrar.  ssl: Permite establecer el SerialNumber en hexadecimal del certificado que se desea mostrar.  qualified: Evolución del anterior que tendría en cuenta si el certificado es de autenticación y hay uno de firma asociado.  dnie: Sólo mostrará los certificados de firma de DNIe.  signingcert: Muestra todos los certificados salvo el de autenticación del DNIe.  authcert: Muestra todos los certificados salvo el de firma del DNIe.
  • 28. FILTROS DE CERTIFICADOS  Más filtros:  Filtro por KeyUsage que permite establecer si los keyusages particulares del certificado deben estar establecidos o no:  keyusage.digitalsignature  keyusage.nonrepudiation  keyusage.keyencipherment  keyusage.dataencipherment  keyusage.keyagreement  keyusage.keycertsign  keyusage.crlsign  keyusage.encipheronly  keyusage.decipheronly
  • 29. FILTROS DE CERTIFICADOS  Más filtros:  subject.rfc2254: Establece un filtro según la RFC 2254 que debe cumplir el Subject del certificado.  issuer.rfc2254: Establece un filtro según la RFC 2254 que debe cumplir el Issuer del certificado.  subject.contains: Establece un texto que debe estar contenido en el principal del subject del certificado.  Ignora mayúsculas y minúsculas.  issuer.contains: Establece un texto que debe estar contenido en el principal del issuer del certificado.  Ignora mayúsculas y minúsculas.
  • 30. FILTRO RFC2254  Filtros conforme al estándar RFC2254.  Implementados en el paquete: afirma-keystores-filters-rfc  Sintaxis:  Sentencias entre paréntesis.  Comprobación del valor de RDN con '=': (c=ES)  El comodín de cadenas es '*': (ou=Metro*)  Caracteres especiales con Unicode: (cn=*28FIRMA29*)  Negación con '!' delante de la expresión: (!(o=*FNMT*))  Condición conjuntiva con '&': (&(l=Madrid)(c=ES))  Condición disyuntiva con '|': (|(o=DIRECCION GENERAL DE LA POLICIA)(o=FNMT))
  • 32. FIRMA POR LOTES CON EL MINIAPPLET  Proceso de firma de múltiples datos como una única operación.  Se definen todos los datos sobre los que se deberá operar en el inicio de la operación.  Operación única para el lote, pero configuración separada para cada operación individual.  Está orientado a reducir en la medida de lo posible la interacción con el usuario.  Especialmente útil cuando el origen y el destino de los datos es un servidor remoto, con lo que se combina con la firma trifásica.  Permite trabajar con lotes completos de datos (se firma todo el lote o no se firma nada, caso común en los portafirmas).
  • 33. FIRMA POR LOTES CON EL MINIAPPLET  XML de ejemplo: <?xml version="1.0" encoding="UTF-8"?> <signbatch stoponerror="false" algorithm="SHA512withRSA"> <singlesign Id="1234"> <datasource>dataB64</datasource> <format>CAdES</format>" <suboperation>sign</suboperation> <extraparams>extraParamsB64</extraparams> <signsaver> <class>es.gob.afirma.signers.batch.SignSaverFile</class> <config>configB64</config> </signsaver> </singlesign> … </signbatch>
  • 34. AGENDA Uso del Cliente @firma por otras aplicaciones
  • 35. USO DEL CLIENTE @FIRMA POR OTRAS APLICACIONES  El Cliente @firma lo conforman por un conjunto de bibliotecas Java (en su gran mayoría).  Las funcionalidades de estas bibliotecas (JAR) pueden ser usadas por otras aplicaciones Java de escritorio o en servidor.  Podemos distinguir entre 2 casos principales cuando queremos utilizar el Cliente @firma desde otra aplicación:  Aplicaciones construidas mediante Maven.  El resto de aplicaciones.  En las aplicaciones construidas con Maven podemos agregar los módulos que nos interesen del Cliente @firma al pom.xml del nuevo proyecto.  En el resto de aplicaciones podemos agregar los JAR del proyecto que deseemos como bibliotecas de la nueva herramienta.
  • 36. USO DEL CLIENTE @FIRMA POR OTRAS APLICACIONES  En las aplicaciones maven agregaremos al pom.xml del proyecto:  Repositorio del que obtener los módulos: <repositories> <repository> <id>uji</id> <url>http://devel.uji.es/nexus/content/groups/public/</url> </repository> </repositories>  Listado de módulos: <dependencies> <dependency> <groupId>es.gob.afirma</groupId> <artifactId>id_modulo</artifactId> </dependency> … </dependencies>
  • 37. USO DEL CLIENTE @FIRMA POR OTRAS APLICACIONES  En las aplicaciones que no utilicen maven podremos utilizar directamente los JAR de los módulos como bibliotecas del proyecto.  Si queremos simplificar, podemos agregar el JAR completo de una de las aplicaciones construidas del Cliente @firma.  Applet Cliente @firma  Cuenta con todos los módulos cliente del proyecto.  MiniApplet @firma  Incluye los módulos de firma y acceso a los repositorios de claves.  StandAlone  Cuenta con todos los módulos del proyecto, excepto filtros de certificados.  AutoFirma  Incluye los módulos de firma y acceso a los repositorios de claves , excepto filtros de certificados.  Los applets se distribuyen ofuscados para reducir su tamaño, por lo que será necesario compilarlos omitiendo la operación de ofuscación.
  • 39. ACCESO A ALMACENES DE CLAVES Y CERTIFICADOS  Módulos relevantes:  afirma-core-keystores  Acceso a los almacenes de claves de Windows y Mac OS X, almacenes PKCS#12 y JKS y tarjetas (PKCS#11).  afirma-keystores-mozilla  Acceso al almacén de Mozilla Firefox.  jmulticard-jse  Uso del DNIe sin drivers.  Clases principales para el uso de los almacenes y certificados:  es.gob.afirma.keystores.AOKeyStore  es.gob.afirma.keystores.AOKeyStoreManagerFactory  es.gob.afirma.keystores.AOKeyStoreManager  es.gob.afirma.keystores.filters.CertificateFilter
  • 40. AOKeyStore  Enumerado con comportamiento y los almacenes de certificados soportados por el módulo.  Contiene los valores:  WINDOWS  APPLE  MOZ_UNI  PKCS12  JAVA  PKCS11  Contiene los métodos relevantes:  PasswordCallback getStorePasswordCallback(Object parent)  PasswordCallback getCertificatePasswordCallback(Object parent)
  • 41. AOKeyStoreManagerFactory  Factoría para la obtención de los manejadores de para cada uno de los almacenes de certificados.  Método para la obtención del manejador:  static AOKeyStoreManager getAOKeyStoreManager(AOKeyStore store, String lib, String description, PasswordCallback pssCallback, Object parentComponent)  Ejemplo: // Creamos el PasswordCallback para la obtencion de la contrasena UIPasswordCallback psc = new UIPasswordCallback( "Contraseu00F1a del almacén PKCS#12 seleccionado", this.parent); // Obtenemos el manejador para un almacen en fichero local de tipo PKCS12 AOKeyStoreManager ksm = AOKeyStoreManagerFactory.getAOKeyStoreManager( AOKeyStore.PKCS12, "/ruta/almacen.pfx", "Almacu00E9n PKCS#12 local", psc, this.parent);
  • 42. AOKeyStoreManager  Manejador para la gestión de un almacén de certificados.  Métodos de interés:  String[] getAliases()  X509Certificate getCertificate(String alias)  X509Certificate[] getCertificateChain(String alias)  KeyStore.PrivateKeyEntry getKeyEntry(String alias)  void refresh()  Ejemplo: // Recuperamos los alias y a partir del primero de ellos la referencia a // clave privada PrivateKeyEntry scKeyEntry = null; String[] aliases = ksm.getAliases(); if (aliases.length > 0) { scKeyEntry = ksm.getKeyEntry(aliases[0]); }
  • 43. CertificateFilter  Clase abstracta de la que debe heredar un filtro de certificados.  Existen varios filtros de certificados implementados: – Filtros RFC2254. – Filtros por KeyUsage. – Filtro de certificado de firma del DNIe. – Filtro de certificados SSCD. – Filtro por número de serie del certificado. – Filtro de certificados caducados. – Etc.  Métodos que declara: – boolean matches(X509Certificate cert) – String[] matches(String[] aliases, AOKeyStoreManager ksm)
  • 44. MÓDULOS DE FIRMA  Los módulos de firma incorporan al Cliente la compatibilidad con nuevos formatos de firma electrónica.  Los manejadores de firma de estos módulos implementan la interfaz:  es.gob.afirma.core.signers.AOSigner  Existen manejadores para los formatos:  CAdES  ASiC-CAdES  XAdES  ASiC-XAdES  Factura-e  PAdES  ODF  OOXML  La gestión de los manejadores de firma se realiza a través de la clase:  es.gob.afirma.core.signers.AOSignerFactory
  • 45. AOSigner  Definen los métodos para la gestión de las firmas: – byte[] sign(byte[] data, String algorithm, PrivateKey pk, Certificate[] certChain, Properties extraParams) – byte[] cosign(byte[] sign, String algorithm, PrivateKey pk, Certificate[] certChain, Properties extraParams) – byte[] cosign(byte[] data, byte[] sign, String algorithm, PrivateKey pk, Certificate[] certChain, Properties extraParams) – byte[] countersign(byte[] sign, String algorithm, CounterSignTarget targetType, Object[] targets, PrivateKey pk, Certificate[] certChain, Properties extraParams) – boolean isValidDataFile(byte[] data) – boolean isSign(byte[] data) – byte[] getData(byte[] signData) – String getSignedName(String originalName, String inText)
  • 46. AOSigner  Ejemplo de firma:  Ejemplo de cofirma: // Instanciamos el manejador de firmas PAdES incluido en el módulo afirma-crypto-pdf AOSigner signer = new AOPDFSigner(); if (!signer.isValidDataFile(data)) { throw new IllegalArgumentException("No se ha introducido un documento PDF valido"); } byte[] signedPDF = signer.sign(data, AOSignConstants.SIGN_ALGORITHM_SHA512WITHRSA, keyEntry.getPrivateKey(), keyEntry.getCertificateChain(), null); // Instanciamos el manejador de firmas CAdES incluido en los módulos afirma-crypto-cades y afirma-crypto- cades-multi AOSigner signer = new AOCAdESSigner(); if (!signer.isSign(data)) { throw new IllegalArgumentException("No se ha introducido una firma CAdES valida"); } if (signer.getData() == null) { throw new IllegalArgumentException("La firma indicada no tiene los datos firmados incluidos"); } byte[] cosignature = signer.cosign(data, AOSignConstants.SIGN_ALGORITHM_SHA512WITHRSA, keyEntry.getPrivateKey(), keyEntry.getCertificateChain(), null);
  • 47. AOSignerFactory  Factoría con la obtener los distintos módulos de firma: – static AOSigner getSigner(String signFormat) • Recupera el manejador de firma para un formato dado. – static AOSigner getSigner(byte[] signData) • Recupera el manejador de firma capaz de tratar firmas como la indicada.  Ejemplo: byte[] cosignature = null; // Cofirmamos en el mismo formato en el que esta firmada AOSigner signer = AOSignerFactory.getSigner(signature); if (signer != null) { cosignature = signer.cosign( signature, // Firma AOSignConstants.SIGN_ALGORITHM_SHA1WITHRSA, // Algoritmo pke.getPrivateKey(), // Referencia a la clave privada del certificado pke.getCertificateChain(), // Cadena de certificacion null // Propiedades extra de configuración ); }
  • 48. FUNCIONES DE UTILIDAD  En los módulos del Cliente se encuentran clases con funciones de utilidad para las distintas operaciones que debe realizar.  Un integrador/desarrollador puede utilizarlas para integrar el Cliente a bajo nivel, desarrollar nuevas funcionalidades o valerse de ellas para su uso por una aplicación externa.  Las principales clases de utilidad son:  AOUtil  AOSignConstants  Base64  MimeHelper  AOUIFactory
  • 49. AOUtil  Utilidades de uso general. – static URI createURI(String file) • Crea una URI a partir de una ruta (local o remota). – static InputStream loadFile(URI uri) • Abre un flujo de datos a partir de una URI. – static byte[] getDataFromInputStream(InputStream input) • Carga los datos de un flujo de datos de entrada. – static boolean copyFile(File source, File dest) • Copia el contenido de un fichero a otro. – static String getCN(X509Certificate c) • Obtiene el nombre común (o el más descriptivo) de un certificado. – static String getCN(String principal) • Obtiene el nombre común (o el más descriptivo) de un nombre X500.
  • 50. AOSignConstants  Clase con constantes de firma: – Nombres de formatos de firma • SIGN_FORMAT_CADES, SIGN_FORMAT_FACTURAE, SIGN_FORMAT_PADES, etc. – Nombres de algoritmos de firma • SIGN_ALGORITHM_SHA1WITHRSA, SIGN_ALGORITHM_SHA512WITHRSA, etc. – Nombres de modos de firma • SIGN_MODE_IMPLICIT / SIGN_MODE_EXPLICIT – Nombre de operaciones masivas • MASSIVE_OPERATION_SIGN, MASSIVE_OPERATION_COUNTERSIGN_LEAFS, etc. – Nombres de estructuras de firma • CMS_CONTENTTYPE_SIGNEDDATA, CMS_CONTENTTYPE_ENVELOPEDDATA, etc. – Nombres de configuraciones por defecto • DEFAULT_SIGN_FORMAT, DEFAULT_MASSIVE_OPERATION, DEFAULT_CMS_CONTENTTYPE, etc.
  • 51. AOBase64  Clase para la conversión de datos Base64: – Conversión de datos a base 64 • static String encode(byte[] source ) – Decodificación de datos base 64 • static byte[] decode( String s )  Admite Base 64 "URL Safe".  Admite compresión de datos.
  • 52. MimeHelper  Clase para la identificación de formatos de datos.  Métodos de interés: – MimeHelper(byte[] data) • Construye un objeto para el análisis de los datos. – String getMimeType() • Devuelve el MimeType de los datos. – String getExtension() • Recupera la extensión asidua para un fichero con este tipo de datos. – static String transformMimeTypeToOid(String mimetype) • Obtiene el OID asociado a un MimeType concreto. – static String transformOidToMimeType(String oid) • Obtiene el MimeType asociado a un OID concreto.
  • 53. AOUIFactory  Factoría para la creación de interfaces gráficas.  Requiere del módulo "afirma-ui-core-jse" u otra implementación.  Los métodos principales son: – static File getLoadFile(String dialogTitle, String currentDir, String fileName, String[] extensions, String description, boolean selectDirectory , boolean multiSelect, Object icon, Object parent) – static File getSaveDataToFile(byte[] data, String dialogTitle, String currentDir, String fileName, File selectedFile, String[] exts, String description, Object parent) – static char[] getPassword(String text, Object parent)