ALTAS MANUAL DE USUARIO DEL SERVICIO DE CERTIFICADOS

Versión 1.5

Área de Aplicaciones Especiales y Arquitectura de Software

Framework Atlas Servicio de Certificados Hoja de Control

Título

Manual de Usuario del Servicio de Certificados

Documento de Referencia

NORMATIVA ATLAS

Responsable

Área de Aplicaciones Especiales y Arquitectura de Software

Versión

1.5

Fecha Versión

26/10/2012

Registro de Cambios Versión

Causa del Cambio

Responsable del Cambio

Fecha del Cambio

Área de Integración y Arquitectura de 1.0

1.1

1.2

1.3

1.4

Versión inicial del documento En ATLAS 1.0.3 la implementación del Servicio se ha modificado por lo tanto este documento ha sido ampliamente modificado. Modificación de apartados 3.2.1 y 3.2.2 para reflejar cambios en nomenclatura de variable app.id.asf Añadido enlace a aplicación de ejemplo en portal ATLAS Actualización a ASF 5. Eliminado apartado 3.1.3, los ficheros de configuración de ASF ya no necesitan residir en la aplicación. Apartado 3.2.1, eliminados parámetros no necesarios. Apartado 3.2.2, nuevas variables de configuración para ASF Se modifica el nombre del área Modificado apartado 3.2.2 para configurar SSL en Weblogic

Aplicaciones

27/01/2010

Área de Integración y Arquitectura de Aplicaciones

27/10/2010

Area de Integración y Arquitectura de Aplicaciones

16/02/2011

Area de Integración y Arquitectura de Aplicaciones

18/05/2011

Área de Aplicaciones Especiales y Arquitectura de Software

13/06/2012

Área de Aplicaciones Especiales y

1.4

Modificado apartado 3.2.2 para configurar SSL en Weblogic

1.5

Añadido punto 4.7 para indicar operaciones no estándar en ASF Añadidos múltiples ejemplos de Área de Aplicaciones Especiales y nuevas funcionalidades Arquitectura de Software añadidas. Apartado 3.1.3, añadida clase de servicio para inyectar servicio ASF.

Arquitectura de Software

2 de 41

29/08/2012

19/10/2012

Framework Atlas Servicio de Certificados

Índice

1.

INTRODUCCIÓN ................................................................................................................................................................ 4 1.1. 1.2.

AUDIENCIA OBJETIVO ...................................................................................................................................................... 4 CONOCIMIENTOS PREVIOS ............................................................................................................................................... 4

2.

DESCRIPCIÓN .................................................................................................................................................................... 5

3.

INSTALACIÓN Y CONFIGURACIÓN............................................................................................................................. 6 3.1. INSTALACIÓN .............................................................................................................................................................. 6 3.1.1. Paso 1: Añadir la dependencia al módulo de Seguridad ........................................................................................ 6 3.1.2. Paso 2: Incluir la ruta de definición del servicio ‘asfService’ ................................................................................ 7 3.1.3. Paso 3: Inyectar el Servicio en las clases que lo requieran.................................................................................... 7 3.2. CONFIGURACIÓN ....................................................................................................................................................... 8 3.2.1. Configuración básica .............................................................................................................................................. 8 3.2.2. Configuración avanzada ......................................................................................................................................... 9 3.2.3. Configuración del plugin de Jetty para trabajar como servidor seguro ............................................................... 12 3.2.4. Configuración de Weblogic para trabajar como servidor seguro ........................................................................ 14

4.

USO ...................................................................................................................................................................................... 21 4.1. 4.2. 4.3. 4.4. 4.5. 4.6. 4.7. 4.8. 4.9. 4.10. 4.11. 4.12. 4.13. 4.14. 4.15. 4.16.

5.

OBTENCIÓN DE DATOS DE UN CERTIFICADO DIGITAL ..................................................................................................... 21 COMPROBACIÓN DE ACCESO DE UN CERTIFICADO .......................................................................................................... 22 CIFRADO Y DESCIFRADO DE DATOS CON CLAVE ............................................................................................................. 23 CIFRADO Y DESCIFRADO DE DATOS CON CERTIFICADO .................................................................................................. 24 FIRMA ELECTRÓNICA EN SERVIDOR ............................................................................................................................... 25 FIRMA DE PDF ................................................................................................................................................................ 25 FIRMA DE FICHEROS XML ............................................................................................................................................. 27 FIRMA XADES .............................................................................................................................................................. 30 VALIDACIÓN DE FIRMAS ELECTRÓNICAS........................................................................................................................ 31 VERIFICACIÓN DE UN CERTIFICADO DIGITAL ............................................................................................................. 32 VERIFICACIÓN DE FIRMA PDF .................................................................................................................................... 33 VALIDACIÓN DE FIRMA XMLDSIG ............................................................................................................................ 34 VALIDACIÓN DE FIRMA XADES ................................................................................................................................ 34 EXTRACCIÓN DE INFORMACIÓN DE FIRMA DE UN DOCUMENTO XML ........................................................................ 35 INDICAR OPERACIÓN NO ESTÁNDAR DE ASF .............................................................................................................. 37 APLICACIÓN DE EJEMPLO ........................................................................................................................................... 39

ENLACES RELACIONADOS .......................................................................................................................................... 41

3 de 41

Framework Atlas Servicio de Certificados Contenido 1. INTRODUCCIÓN Este documento contiene el manual de uso del servicio de certificados del módulo de seguridad del framework Atlas. En él se incluye información sobre cómo utilizar dicho componente en una aplicación, así como información acerca de la configuración de los parámetros fundamentales del componente. 1.1.

Audiencia objetivo

El lector objetivo de este documento es toda aquella persona que esté desarrollando una aplicación basada en el framework Atlas y desee acceder a la plataforma ASF. 1.2.

Conocimientos Previos

Para un completo entendimiento del documento, el lector deberá tener conocimientos previos sobre las siguientes tecnologías: -

Lenguaje Java

-

Spring Framework

-

Conocimientos básicos de ASF y certificados digitales X.509

Para saber más sobre dichas tecnologías, consultar los accesos referenciados en el apartado 5 de este documento, “Enlaces Relacionados”.

4 de 41

Framework Atlas Servicio de Certificados

2. DESCRIPCIÓN El servicio de Spring “asfService” que incluye el módulo de seguridad de Atlas, provee las siguientes funcionalidades: ·

Obtención de datos de un certificado

·

Cifrado y descifrado de datos simétrico con clave

·

Cifrado y descifrado asimétrico con certificado

·

Firma electrónica en servidor

·

Firma electrónica en cliente (en documento aparte)

·

Verificación de firmas electrónicas

·

Validación de certificados digitales

5 de 41

Framework Atlas Servicio de Certificados

3. INSTALACIÓN Y CONFIGURACIÓN 3.1.

INSTALACIÓN

El Servicio de Certificados para ASF viene incluido en el módulo de seguridad de atlas que, a su vez, viene incluido en el arquetipo web. Para poder utilizarlo, bastará con incluir la dependencia de este módulo en el fichero pom.xml del proyecto, añadir la ruta correspondiente al fichero xml de Spring en la variable ‘configLocations’, y definir en el contexto de Spring la configuración del servicio para la aplicación. 3.1.1.

Paso 1: Añadir la dependencia al módulo de Seguridad Atención

Este paso no es necesario si el proyecto se ha generado a partir del arquetipo web, servicioweb o documentumweb de Atlas.

Para añadir la dependencia al módulo de seguridad dentro de nuestro proyecto maven hay que añadir una entrada “dependency” en la sección “dependencies” del fichero “pom.xml” del proyecto, como se puede ver en el siguiente ejemplo:

pom.xml [...] atlasfrm atlasfrm-seguridad-lib ${atlasfrm-seguridad-lib} [...]

6 de 41

Framework Atlas Servicio de Certificados 3.1.2.

Paso 2: Incluir la ruta de definición del servicio ‘asfService’

La librería de seguridad ya contiene una definición del servicio ‘asfService’ dentro del contexto de Spring. Bastará con incluir la siguiente ruta dentro de la configuración de los ‘configLocations’ (usualmente en el fichero web.xml): classpath:/conf/applicationContext-asf.xml A continuación se muestra un ejemplo de configLocations en el fichero web.xml: web.xml Este parámetro indica la localización exacta de los ficheros de configuración de SPRING contextConfigLocation classpath:/conf/applicationContext-security.xml; classpath:/conf/applicationContext-security-hostPolitica.xml; classpath:/conf/applicationContext-componentes.xml; classpath:/conf/atlas-trazas-application-context.xml; classpath:/conf/applicationContext-asf.xml; classpath:/conf/applicationContext-general.xml; classpath:/conf/applicationContext-database.xml;

3.1.3.

Paso 3: Inyectar el Servicio en las clases que lo requieran

Para inyectar el Servicio previamente definido, se pasa como “property” al bean que lo vaya a usar, que debe tener el método “set” correspondiente. Para más información sobre cómo inyectar referencias, se puede consultar la documentación de Spring. applicationContext-services.xml

xxxx.services.MiServiceImpl.java public class MiServiceImpl implements MiService { private AsfService asfService; public void setAsfService(AsfService asfService) { this.asfService = asfService; } ... }

7 de 41

Framework Atlas Servicio de Certificados 3.2.

CONFIGURACIÓN 3.2.1.

Configuración básica

En el modo básico de configuración, esto es, tomando todos los valores por defecto (ver tabla de apartado 3.2.2) solo será necesario configurar los valores del fichero ‘environment.properties’, principalmente el parámetro ‘asf.cipherKey’ que establece la clave de cifrado simétrico para la aplicación (siempre que se use esta funcionalidad). environment.properties ###################################################### # Fichero de variables de configuración específicas # # para el entorno LOCAL # ###################################################### [...] # Recursos de ASF asf.clientJSUrl=https://desarrollo.madrid.org/asf_firma570/js/WS.js asf.cipherKey=************* El resto de parámetros ya están configurados para funcionar correctamente en el entorno local de desarrollo. También será necesario configurar el parámetro ‘app.id.asf’ en el fichero ‘environment.properties’ con el valor dado de alta para la aplicación en el servidor de ASF. Si se quiere asignar a esta variable el nombre de la aplicación se configurará ${app.name} (app.name está definida en el fichero conf/application.properties).

environment.properties ###################################################### # Fichero de propiedades donde se configuran todos # # los parametros de la aplicación que no necesitan # # una configuración diferente para cada entorno (su # # valor es el mismo en el entorno de desarrollo # # local, validación y producción) # ###################################################### [...] # Ids de aplicacion app.id.asf=APL_DEMO #app.id.asf=${app.name} app.id.certificate=EJPL #app.id.certificate=${app.name}

8 de 41

Framework Atlas Servicio de Certificados 3.2.2.

Configuración avanzada

Si se necesita cambiar la configuración por defecto del servicio de ASF será necesario redefinir el bean ‘asfConfiguration’ en el contexto de Spring. Las propiedades de configuración se pueden definir en el mismo fichero de Spring o en un fichero aparte. El siguiente ejemplo, además de los parámetros de configuración básica, se cambia el valor por defecto de la propiedad ‘signEncoding’ (las variables asf.clientJSUrl, asf.cipherKey y app.id.asf son tomadas por maven del fichero environment.properties):

applicationContext-services.xml





En este ejemplo, la propiedad ‘applicationIdForAllOperations’ realiza un set del valor en las propiedades ‘invokingApp’, ‘signApplicationId’ y ‘verifySignatureApplicationId’. Esto es así para simplificar la configuración. Los valores de las propiedades ‘clientJsUrl’ y ‘cipherKey’ hacen referencia a las propiedades ‘asf.clientJSUrl’ y ‘asf.cipherKey’ del fichero ‘environment.properties’ (reemplazadas por sus valores en la ejecución de maven). Si cualquier otra variable de configuración es susceptible de cambio con el entorno, deben definirse de esta forma. En el siguiente ejemplo se utiliza un fichero de propiedades como base de configuración:

applicationContext-services.xml

src/main/resources/conf/asf.properties

9 de 41

Framework Atlas Servicio de Certificados ########################################################## # Variables de configuración de la aplicación para ASF # ########################################################## # Configuracion general de ASF asfConfiguration.invokingApp = ${app.id.asf} asfConfiguration.signEncoding = iso-8859-1 # Configuración de la firma asfConfiguration.signApplicationId = ${app.id.asf} asfConfiguration.signRegisterRevocation = false asfConfiguration.signIgnoreVerificationCaches = false asfConfiguration.signSequential = true asfConfiguration.signTimestamp = false # Configuración de la validación asfConfiguration.verifySignatureApplicationId = ${app.id.asf} asfConfiguration.verifyRegisterNoRepudiation = false asfConfiguration.verifySignatureCheckRevocation = false asfConfiguration.verifyIgnoreVerificationCaches = true asfConfiguration.verifyAddSignature = false # Configuración de la validación de certificados asfConfiguration.verifyCheckCertificateRevocation = true asfConfiguration.verifyCheckCertificateValidity = true # Configuración para la firma en cliente asfConfiguration.clientJsUrl = ${asf.clientJSUrl} # Configuración para cifrado/descifrado sin certificado asfConfiguration.cipherKey = ${asf.cipherKey} asfConfiguration.cipherMode = CBC asfConfiguration.cipherAlgorithm = 3DES asfConfiguration.cipherOperationTypeEn = 3 asfConfiguration.cipherOperationTypeDe = 4 asfConfiguration.cipherPadding = PKCS5Padding

A continuación se muestra una tabla con todos los atributos configurables de la clase AsfConfiguration:

Atributo invokingApp

Descipción Id de la aplicación en ASF. La aplicación debe

Obligatorio

Valor por defecto

SI

Sin valor por

estar dada de alta en ASF verifySignatureApplicationId

Id de la aplicación en ASF usado en operaciones de

defecto SI

verificación de firmas. signApplicationId

invokingApp

Id de la aplicación en ASF para operaciones de

SI

firma. signRegisterRevocation

Valor de

Valor de invokingApp

Registrar (o no) las revocaciones.

10 de 41

NO

false

Framework Atlas Servicio de Certificados signIgnoreVerificationCaches

Ignorar (o no) la caché de verificaciones en firma.

NO

false

signEncoding

Codificación de caracteres en firma

NO

iso-8859-1

signSequential

Firma secuencial

NO

true

signTimestamp

Incluír (o no) sellos de tiempo en la firmas.

NO

false

verifyRegisterNoRepudiation

Almacenar (o no) la información necesaria para

NO

false

NO

false

garantizar el no repudio. verifySignatureCheckRevocati

Comprobar (o no) el estado de revocación del

on

cerificado firmante.

verifyAddSignature

verifyAddSignature

NO

false

verifyIgnoreVerificationCache

Ignorar (o no) la caché de verificaciones.

NO

true

verifyCheckCertificateRevocat

Verificar (o no) el estado de revocación del

NO

true

ion

cerificado al validar los certificados.

verifyCheckCertificateValidity

Verificar (o no) el estado de validez (caducidad) del

NO

true

s

cerificado al comprobar el cetificado. cipherAlgorithm

Algoritmo de cifrado simétrico con clave

NO

3DES

cipherKey

Clave de cifrado simétrico

SI

Sin valor por defecto

cipherMode

Modo de cifrado simétrico

NO

CBC

cipherPadding

Padding de cifrado

NO

PKCS5Padding

clientJsUrl

URL del Javascript de firma en cliente

SI

Sin valor por defecto

ficheroLog

Ruta y nombre de los ficheros de log de ASF

NO

Sin valor por defecto

nivelLog

Nivel de trazas de ASF, puede ser ‘10’, ‘20’ o ‘30’.

NO

‘30’ hace que se muestren todas las trazas secureCall

Si vale true las llamadas al servidor de ASF se realizarán de forma segura

11 de 41

Sin valor por defecto

NO

false

Framework Atlas Servicio de Certificados keystoreType

Tipo de almacén de claves para comunicación

NO

segura keystoreFile

defecto

Ruta al almacén de claves para comunicación

NO

segura keystorePass

Sin valor por defecto

Clave de acceso al almacén de claves para

NO

comunicación segura keystoreKeyAlias

Sin valor por

Sin valor por defecto

Alias de la clave a utilizar para comunicación segura

NO

Sin valor por defecto

searchInApplication

Si el servicio de ASF no puede localizar en el

NO

true

sistema los ficheros de propiedades, este parámetro indica si deben buscarse en el classpath de aplicación y en sus librerías.

3.2.3.

Configuración del plugin de Jetty para trabajar como servidor seguro

Atención Este paso no es necesario si el proyecto se ha generado a partir del arquetipo web, servicioweb o documentumweb de Atlas.

Para poder probar la aplicación con un servidor seguro, es necesario configurar el plugin de Jetty para maven. Serán necesarios los siguientes elementos: ·

Almacén de certificados con las CAs cuyos certificados se admitirán. Para la fase de pruebas bastará con la CA de desarrollo de ICM. El almacén debe terminar en .keystore. Este fichero se llamará truststore.keystore.

·

Almacen de certificados con el certificado de servidor y toda su cadena de certificación. Para la fase de pruebas se podrá utilizar uno de los certificados de la CA de pruebas de ICM disponible. El almacen deberá terminar en .keystore. El fichero se llamará keystore.keystore.

Ambos almacenes de certificados se almacenarán en la ruta /src/test/resources/ssl del proyecto web.

12 de 41

Framework Atlas Servicio de Certificados

A continuación se reconfigurará el plugin de Jetty para la ejecución SSL: ·

WantClientAuth: si es ‘true’ se pedirá certificado en la conexión SSL, aunque será opcional. De esta forma si no se aporta certificado, se mostrará el login tradicional.

·

NeedClientAuth: si es ‘true’ el certificado de cliente en la conexión será necesario y no se pasará del punto inicial sin aportar uno. Pom.xml del proyecto web

13 de 41

Framework Atlas Servicio de Certificados org.mortbay.jetty jetty-maven-plugin ${jetty-maven-plugin.version} [...] 9080 60000 9443 60000 ${project.build.testOutputDirectory}/ssl/keystore.keystore desarrollo desarrollo ${project.build.testOutputDirectory}/ssl/truststore.keystore desarrollo true false commons-dbcp commons-dbcp ${padre.commons.dbcp.version} com.oracle ojdbc14 ${padre.oracle.version}

3.2.4.

Configuración de Weblogic para trabajar como servidor seguro

Para poder probar la aplicación con un servidor seguro, es necesario configurar el servidor Weblogic. No se podrán hacer pruebas de la aplicación directamente con un servidor jetty. Los pasos a seguir para configurar el servidor como seguro, utilizando los certificados de prueba de icm, son: ·

Paso 1: Activar el SSL en Weblogic:

Acceder a la consola de Weblogic, que normalmente está en la URL http://localhost:7001/console. En la consola, en Entorno->Servidores, pinchar en el servidor AdminServer para acceder a su configuración:

14 de 41

Framework Atlas Servicio de Certificados

En la pestaña Configuración-> General, activar la casilla “Puerto de recepción de SSL activado”:

15 de 41

Framework Atlas Servicio de Certificados Salvar los cambios y en la pestaña Configuracion->SSL->Advanzadas establecer el parámetro “Comportamiento de Certificado de Cliente Bidireccional” a “Certificados de Cliente Solicitados Pero No Aplicados”.

Salvar los cambios. ·

Paso 2: Configurar los almacenes de certificados en Weblogic:

Los certificados SSL para weblogic pueden descargarse del sitio web de ArquitecturaSW. También pueden obtenerse de un arquetipo web en la ruta src/test/resources/ssl. El contenido del paquete son dos ficheros: keystore.jks y truststore.jks. Estos almacenes ya están preconfigurados para el uso en un servidor de aplicaciones. Deben dejarse estos ficheros en una ruta conocida del disco duro para su posterior referencia. En adelante, se asumirá que están en la ruta: D:\Oracle\Middleware\ssl. En la consola de Weblogic, en Entorno->Servidores seleccionar el servidor AdminServer:

16 de 41

Framework Atlas Servicio de Certificados

En la pestaña Configuración -> Almacenes de Claves, en el parámetro Almacenes de Claves pulsar el botón Cambiar:

17 de 41

Framework Atlas Servicio de Certificados

Seleccionar “Identidad Personalizada y Protección Personalizada” y guardar cambios.

18 de 41

Framework Atlas Servicio de Certificados

Configurar los siguientes parámetros: ·

Identidad: o

Almacén de Claves de Identidad Personalizado: ruta a keystore.jks (D:\Oracle\Middleware\ssl\keystore.jks).

·

o

Tipo de Almacén de Claves de Identidad Personalizado: jks

o

Contraseña de Almacén de Claves de Identidad Personalizado: desarrollo

o

Confirmar Contraseña de Almacén de Claves de Identidad Personalizado: desarrollo

Protección: o

Almacén de Claves de Protección Personalizado: ruta a truststore.jks (D:\Oracle\Middleware\ssl\truststore.jks).

o

Tipo de Almacén de Claves de Protección Personalizado: jks

o

Contraseña de Almacén de Claves de Protección Personalizado: desarrollo

o

Confirmar Contraseña de Almacén de Claves de Protección Personalizado: desarrollo

Guardar cambios. El servidor está ahora listo para su uso. ·

Paso 3: Crear variable de entorno para weblogic. o

Establecer la variable JAVA_OPTIONS=-Dweblogic.security.SSL.allowSmallRSAExponent=true

19 de 41

Framework Atlas Servicio de Certificados

·

Paso 4: Importar el certificado cliente en el navegador.

Una vez realizados estos pasos, ya estamos listos para probar aplicaciones con SSL instaladas en el servidor Weblogic. El puerto por defecto SSL de Weblogic es el 7002. Los certificados de pruebas de la CA de Icm pueden descargarse en la ruta: http://desarrollo.madrid.org/certificados/descarga_de_certificados.htm.

20 de 41

Framework Atlas Servicio de Certificados

4. USO Una vez configurado el entorno para el uso del componente, puede procederse a su utilización. 4.1.

Obtención de datos de un certificado digital

Para obtener los datos de un certificado digital, se utiliza el método “getDatosCertificado”, que recibe el certificado X509 en base64 o en una instancia X509Certificate cuyos datos se quieren obtener. El método devuelve un objeto “atlas.core.seguridad.asf.domain.DatosCertificado”. En el siguiente ejemplo, se muestra un método de un ManagedBean de JSF que recoge los datos de un certificado para pintarlos en pantalla.

AsfBean.java /** * Obtiene los datos de un certificado para pintar su contenido * @return id de página */ public String obtenerDatosCertificado() { try { this.datosCertificado = this.asfService.getDatosCertificado(strCertificado); } catch (ServiceException e) { log.error("Error obteniendo datos de certificado.", e); AtlasFacesUtils.addErrorMessage(e.getMessage()); } return NavigationResults.SUCCESS; } /** * Obtención de los datos de certificado de login de usuario * @return DatosCertificado con los datos del certificado de login * @throws ServiceException si hubo algún problema */ private DatosCertificado getDatosCertificadoLogin() throws ServiceException { // Obtenemos el certificado de login del request X509Certificate[] chain = (X509Certificate[]) FacesContext. getCurrentInstance().getExternalContext().getRequestMap(). get("javax.servlet.request.X509Certificate"); if (chain == null || chain.length == 0) { log.warn("No se ha detectado certificado de autenticacion"); return null; } // Llamar al servicio de ASF para obtener los datos del certificado return this.asfService.getDatosCertificado(chain[0]); }

21 de 41

Framework Atlas Servicio de Certificados

4.2.

Comprobación de acceso de un certificado

En aplicaciones donde el acceso de los usuarios se realice mediante certificado, es posible restringir los tipos de certificado a un subconjunto de los admitidos por ICM. En ASF se realiza la configuración de certificados admitidos en una operación y posteriormente, en la aplicación se consulta si el certificado aportado por el usuario está dentro de este conjunto.

AsfService.java /** * Obtiene información de acceso del certificado pasado, sobre la operación de * verificacion en ASF * @param datosCert objeto con la información del certificado a comprobar * @return true si el certificado tiene acceso; false en caso contrario * @throws ServiceException si hubo problemas en la comprobacion */ boolean comprobarAcceso(DatosCertificado datosCert) throws ServiceException; /** * Obtiene información de acceso del certificado pasado, sobre la operación de * verificacion en ASF * @param cert objeto con la información del certificado a comprobar * @return true si el certificado tiene acceso; false en caso contrario * @throws ServiceException si hubo problemas en la comprobacion */ boolean comprobarAcceso(X509Certificate cert) throws ServiceException;

Atención Estos métodos solo podrán utilizarse en la creación de políticas de seguridad propias de la aplicación según la normativa de ATLAS.

A continuación se muestra un ejemplo de uso de esta funcionalidad:

Ejemplo de uso DatosCertificado datosCert = this.asfService.getDatosCertificadoDeAlias("2w"); boolean ok = this.asfService.comprobarAcceso(datosCert); log.info("El certificado '2w' tiene acceso a la aplicación: " + ok);

22 de 41

Framework Atlas Servicio de Certificados 4.3.

Cifrado y descifrado de datos con clave

Para el cifrado de datos con clave se utiliza el método ‘cifrar’. Su correspondiente método de descifrado es ‘descifrar’. A continuación se muestra un extracto de la interfaz de servicio:

AsfService.java /** * Cifrar texto con clave simétrica * @param texto texto a cifrar * @return mensaje cifrado * @throws ServiceException si hubo algún problema */ String cifrar(String texto) throws ServiceException; /** * Descifrar texto con clave simétrica * @param texto texto a descifrar * @return texto descifrado * @throws ServiceException si hubo algún problema */ String descifrar(String texto) throws ServiceException;

La clave de cifrado a usar se establece en el objeto de configuración del servicio ‘AsfConfiguration’, parámetro ‘cypherKey’. El siguiente ejemplo de uso muestra una operación de cifrado y descifrado obteniendo así el texto original.

Ejemplo de uso String texto = "Ejemplo de cifrado/descifrado"; log.info("Texto original: '" + texto + "'"); // Cifrar texto con clave String cifrado = null; try { cifrado = this.asfService.cifrar(texto); } catch (ServiceException e) { log.error("Error cifrando datos.", e); } log.info("Texto cifrado: '" + cifrado + "'"); // Descifrar texto con clave String descifrado = null; try { descifrado = this.asfService.descifrar(cifrado); } catch (ServiceException e) { log.error("Error descifrando datos.", e); } log.info("Texto descifrado: '" + descifrado + "'");

23 de 41

Framework Atlas Servicio de Certificados 4.4.

Cifrado y descifrado de datos con certificado

Para el cifrado de datos con clave se utiliza también el método ‘cifrar’, aunque los parámetros a pasar son diferentes de los del apartado anterior. Su correspondiente método de descifrado es ‘descifrar’. A continuación se muestra un extracto de la interfaz de servicio:

AsfService.java /** * Cifrar texto con certificado * @param texto texto a cifrar * @param aliasCertificado alias del certificado de firma en plataforma ASF * @return texto cifrado * @throws ServiceException si ha habido problemas en el firmado */ String cifrar(String texto, String aliasCertificado) throws ServiceException; /** * Descifrar texto con certificado * @param texto texto a descifrar * @param aliasCertificado alias del certificado de firma en plataforma ASF * @return texto descifrado * @throws ServiceException si ha habido problemas en el descifrado */ String descifrar(String texto, String aliasCertificado) throws ServiceException;

El certificado cuyo alias se pasa en los métodos de cifrado y descifrado deberá estar dado de alta en la plataforma ASF para el id de aplicación configurado. El siguiente ejemplo de uso muestra una operación de cifrado y descifrado obteniendo así el texto original. Ejemplo de uso String texto = "Texto de ejemplo"; String aliasCertificado = "2w"; // Certificado instalado en ASF log.info("Texto original: '" + texto + "'"); // Cifrar texto con certificado String cifrado = null; try { cifrado = this.asfService.cifrar(texto, aliasCertificado); } catch (ServiceException e) { log.error("Error cifrando datos.", e); } log.info("Texto cifrado: '" + cifrado + "'"); // Descifrar texto con certificado String descifrado = null; try { descifrado = this.asfService.descifrar(cifrado, aliasCertificado); } catch (ServiceException e) { log.error("Error descifrando datos.", e); } log.info("Texto descifrado: '" + descifrado + "'");

24 de 41

Framework Atlas Servicio de Certificados 4.5.

Firma electrónica en servidor

La firma electrónica de unos datos permite garantizar su integridad (que no ha sido modificada desde que se firmó) y el no repudio (no se puede negar haber firmado los datos); opcionalmente también permite garantizar que los datos fueron firmados en un momento determinado. Para realizar una firma electrónica en servidor, ser utiliza el método “firmar”, que recibe dos parámetros: un array de bytes con los datos a firmar y una cadena con el alias del certificado con el que se quieren firmar (tiene que estar definido previamente en ASF para la aplicación). El método devuelve una cadena con la firma codificada en base 64. Este tipo de firma sirve para textos y datos binarios.

AsfService.java /** * Realiza una firma digital de los datos pasados con el certificado identificado * por el alias * @param datos datos para realizar la firma digital * @param alias alias del certificado en la plataforma ASF * @return firma digital * @throws ServiceException si hubo algún problema */ String firmar(byte[] datos, String alias) throws ServiceException;

A continuación se muestra un ejemplo de uso de firmado con certificado:

Ejemplo de uso String texto = "Texto de ejemplo"; String aliasCertificado = "1r"; // Tiene que estar dado de alta en ASF log.info("Texto original: '" + texto + "'"); // Firmado String firma = null; try { firma = this.asfService.firmar(texto.getBytes(), aliasCertificado); } catch (ServiceException e) { log.error("Error realizando firma.", e); } log.info("Firma: '" + firma + "'");

4.6.

Firma de Pdf

La firma PDF en servidor puede realizarse llamando al siguiente método del servicio:

AsfService.java

25 de 41

Framework Atlas Servicio de Certificados /** * Realiza una firma digital para ficheros Pdf. * @param alias alias del certificado de firma en la plataforma ASF * @param inPdf documento PDF a firmar * @return documento PDF firmado * @throws ServiceException si hubo algún problema */ byte[] firmarPdf(String alias, byte[] inPdf) throws ServiceException;

Como parámetros han de pasarse el alias del certificado en la plataforma ASF y el contenido del fichero PDF a firmar. El resultado será el contenido del fichero PDF ya firmado. Para ejecutar esta operación debe haberse solicitado previamente el alta de la aplicación en ASF, así como de una operación de firma y un certificado asociado a esta operación (cuyo alias será el que habrá que pasar al método). A continuación se muestra un ejemplo de uso de este método:

Ejemplo de uso // leer pdf de pruebas de disco File f = new File("pdfSignTest.pdf"); byte[] pdf = ... Realizar lectura de fichero ... // firmar pdf byte[] signed = this.asfService.firmarPdf("2w", pdf); // Grabar fichero firmado File fout = new File("pdf_signed.pdf"); out = new FileOutputStream(fout); out.write(signed); out.close();

Se pueden personalizar algunos aspectos de la firma del fichero PDF a través de la clase atlas.core.seguridad.asf. domain.PdfSignAppearance. Los valores personalizables son: ·

Coordenadas x,y de la caja de firma.

·

Altura y anchura de la caja de firma.

·

Página donde se ubicará la parte visible de la firma.

·

Visibilidad de la caja de firma.

A continuación se muestra un ejemplo donde la caja de firma se ubicará en la página 3 del documento pdf:

AsfService.java

26 de 41

Framework Atlas Servicio de Certificados /** * Realiza una firma digital para ficheros Pdf. * @param alias alias del certificado de firma en la plataforma ASF * @param inPdf documento PDF a firmar * @param usarTsa usar sello de tiempo? * @param apariencia información de la visualización de la firma * @return documento PDF firmado * @throws ServiceException si hubo algún problema */ byte[] firmarPdf(String alias, byte[] inPdf, boolean usarTsa, PdfSignAppearance apariencia) throws ServiceException;

Este método permite también incluir un sello de tiempo (usarTsa) en la firma Pdf.

Ejemplo de uso // leer pdf de pruebas de disco File f = new File("pdfSignTest.pdf"); byte[] pdf = ... Realizar lectura de fichero ... // firmar pdf pagina 3 PdfSignAppearance apariencia = new PdfSignAppearance(); apariencia.setPage(3); signed = this.asfService.firmarPdf("2w", pdf, false, apariencia); // Grabar fichero firmado File fout = new File("pdf_signed.pdf"); out = new FileOutputStream(fout); out.write(signed); out.close();

4.7.

Firma de ficheros XML

La firma XML se realiza en formato XMLDsig. En el siguiente apartado se mostrará la firma XAdES (también para ficheros XML). En la firma XMLDsig básica se ejecuta una firma de tipo Enveloping en el documento xml completo. En este tipo de firma, el tag raíz del documento XML será el tag de firma, y el documento original quedará englobado dentro de la estructura de la firma.

AsfService.java

27 de 41

Framework Atlas Servicio de Certificados /** * Realiza una firma digital para ficheros XML en formato XMLDsig enveloping * (el tag de firma es la raiz del Xml original que queda embebido dentro). * La firma digital se realiza sobre todo el documento Xml de entrada * (se firma el tag raiz). * @param alias alias del certificado en la plataforma ASF * @param xml fichero XML a firmar * @return xml firmado * @throws ServiceException si hubo algún problema */ String firmarXml(String alias, byte[] xml) throws ServiceException;

Solo será necesario indicar el alias del certificado en la plataforma ASF y el documento XML a firmar.

Ejemplo de uso String xml = "" + "Test de firmado XML"; // Firma enveloping de todo el XML String envelopingFull = this.asfService.firmarXml("2w", xml.getBytes());

En el siguiente ejemplo, la firma seguirá siendo de tipo Enveloping, pero se indica el Id del tag a firmar. No se firmará el documento completo, solo el bloque del tag cuyo Id se ha indicado.

AsfService.java /** * Realiza una firma digital para ficheros XML en formato XMLDsig enveloping * (el tag de firma es la raiz del Xml original que queda embebido dentro). * La firma digital se realiza sobre el tag cuyo ID se indica en el parámetro * idToSign. Es obligatorio que el tag a firmar tenga un atributo de nombre * 'id' y un valor que identifique univocamente al nodo dentro del documento Xml. * @param alias alias del certificado en la plataforma ASF * @param xml fichero XML a firmar * @param idToSign id del tag a firmar. Ej.: "idBody" * @return xml firmado * @throws ServiceException si hubo algún problema */ String firmarXml(String alias, byte[] xml, String idToSign) throws ServiceException;

Ejemplo de uso String xml = "" + "Test de firmado XML"; // Firma enveloping de parte del XML String envelopingPart = this.asfService.firmarXml("2w", xml.getBytes(), "idBody");

28 de 41

Framework Atlas Servicio de Certificados

En este ejemplo, en lugar de firmarse el tag como en el caso anterior, solo se firmará el tag . En el siguiente ejemplo, la firma será de tipo Enveloped, es decir, la estructura del documento original no se alterará. El tag de firma se insertará como hijo del tag indicado.

AsfService.java /** * Realiza una firma digital para ficheros XML en formato XMLDsig. Si se indica * el parámetro insertSignTagName, la firma se realizará en formato * 'enveloped' (el tag de firma se inserta como hijo del nodo cuyo nombre * se ha especificado en el parámetro); en caso contrario, la firma será de * tipo enveloping. * @param alias alias del certificado en la plataforma ASF * @param xml fichero XML a firmar * @param idToSign id del tag a firmar. Ej.: "idBody" * @param insertSignTagName nombre del tag debajo del cual colocar la firma. * Ej.: "head" * @return xml firmado * @throws ServiceException si hubo algún problema */ String firmarXml(String alias, byte[] xml, String idToSign, String insertSignTagName) throws ServiceException; Ejemplo de uso String xml = "" + "Test de firmado XML"; // Firma enveloped String enveloped = this.asfService.firmarXml("2w", xml.getBytes(), "idBody", "head");

29 de 41

Framework Atlas Servicio de Certificados

En este ejemplo, el tag raíz del documento XML seguirá siendo . Se firmará el tag y el elemento de la firma se insertará como hijo del tag .

4.8.

Firma XAdES

La firma XAdES es otro formato de firma XML. Es una extensión de la firma XMLDsig y presenta una estructura de tipo Enveloped. Existen tres tipo de firma XAdES soportada por ATLAS: ·

XAdES BES: firma de tipo básico, la más simple de todas.

·

XAdES T: firma básica con sello de tiempo.

·

XAdES XL: añade los propios certificados y listas de revocación a los documentos firmados para permitir la verificación en el futuro incluso si las fuentes originales (de consulta de certificados o de las listas de revocación) no estuvieran ya disponibles.

Los servicios disponibles para esta firma son los siguientes:

AsfService.java /** * Realiza una firma digital para ficheros XML en formato XAdES (Basico). La firma * digital se realiza sobre todo el documento Xml de entrada (se firma el tag raiz). * @param alias alias del certificado en la plataforma ASF * @param xml fichero XML a firmar * @return xml firmado * @throws ServiceException si hubo algún problema */ String firmarXadesBes(String alias, byte[] xml) throws ServiceException;

AsfService.java /** * Realiza una firma digital para ficheros XML en formato XAdES-T * (Basico + timestamp). La firma digital se realiza sobre todo el documento Xml) * de entrada (se firma el tag raíz. * @param alias alias del certificado en la plataforma ASF * @param xml fichero XML a firmar * @return xml firmado * @throws ServiceException si hubo algún problema */ String firmarXadesT(String alias, byte[] xml) throws ServiceException;

AsfService.java

30 de 41

Framework Atlas Servicio de Certificados /** * Realiza una firma digital para ficheros XML en formato XAdES-XL * (Basico + extended long-term). La * firma digital se realiza sobre todo el documento Xml de entrada (se firma el tag * raiz). * @param alias alias del certificado en la plataforma ASF * @param xml fichero XML a firmar * @return xml firmado * @throws ServiceException si hubo algún problema */ String firmarXadesXL(String alias, byte[] xml) throws ServiceException;

A continuación un ejemplo de uso:

Ejemplo de uso String xml = "" + "Test de firmado XML"; log.info("Ejecutando firma..."); String xmlFirmado = this.asfService.firmarXadesBes("2w", xml.getBytes());

4.9.

Validación de firmas electrónicas

La validación de la firma electrónica de unos datos permite comprobar su integridad (que no ha sido modificada desde que se firmó) y el no repudio (no se puede negar haber firmado los datos); opcionalmente también permite garantizar que los datos fueron firmados en un momento determinado. Para validar una firma electrónica, ser utiliza el método “validar”, que recibe dos parámetros: un array de bytes con los datos originales y una cadena con la firma codificada en base 64. El método devuelve una enumeración de tipo “SignatureStatus”.

AsfService.java /** * Realiza una validación de la firma digital pasada respecto al texto * @param signedData datos de firma digital * @param firma texto original con el que se ha realizado la firma * @return SignatureEstatus con el estado de la firma * @throws ServiceException si hubo algún problema */ SignatureStatus validarFirma(byte[] signedData, String firma) throws ServiceException;

31 de 41

Framework Atlas Servicio de Certificados

Ejemplo de uso // Validación de firma String texto = "Texto de ejemplo"; String firma = "[...]"; // firma del texto en formato Base64 try { // La firma será correcta, el resultado será SignatureStatus.OK SignatureStatus estado = this.asfService.validarFirma(texto.getBytes(), firma); log.info("Estado para texto: " + estado); // El texto firmado ha sido modificado (toUpperCase()), el resultado será // SignatureStatus.NOT_VALID estado = this.asfService.validarFirma(texto.toUpperCase().getBytes(), firma); log.info("Estado para texto modificado: " + estado); } catch (ServiceException e) { log.error("Error verificando firma.", e); }

4.10.

Verificación de un certificado digital

La verificación de un certificado digital permite comprobar que es válido (que no está caducado, que no ha sido revocado, que se confía en su emisor, que no ha sido modificado desde su emisión…). Para verificar un certificado electrónico, ser utiliza el método “getEstadoCertificado”. Este método acepta instancias de X509Certificate y representaciones en base64 de un certificado (formato PEM). El resultado de este método es un objeto de tipo ‘CertificateStatus’.

Test de ejemplo de comprobación de estado de certificado

32 de 41

Framework Atlas Servicio de Certificados String aliasRevocado = "4g"; String aliasCorrecto = "2w"; String pemCertificate = // certificado '2w' "-----BEGIN CERTIFICATE-----\n" + "MIID1jCCAz+gAwIBAgIBcDANBgkqhkiG9w0BAQUFADCBnzELMAkGA1UEBhMCRVMx\n" + "[...]" + "e2tbPsZ7/W7hxNFdCI0EPXdEQTSYS6MoVfY=\n" + "-----END CERTIFICATE-----\n"; try { CertificateStatus status = this.asfService.getEstadoCertificado( getCertificate(aliasRevocado)); assertEquals(status, CertificateStatus.REVOKED); status = this.asfService.getEstadoCertificado(getCertificate(aliasCorrecto)); assertEquals(status, CertificateStatus.OK); // Certificado en formato PEM status = this.asfService.getEstadoCertificado(pemCertificate); assertEquals(status, CertificateStatus.OK); } catch (ServiceException e) { fail("Error de certificado: " + e.getMessage()); }

Aunque con ‘getEstadoCertificado’ se puede comprobar si el certificado ha sido revocado, se ha creado un método específico para hacer esta comprobación. El método es ‘comprobarRevocacion’ que devuelve un booleano indicando si el certificado está revocado (true) o no (false). Este método, también admite el certificado a comprobar en base64 o en X509Certificate. 4.11.

Verificación de firma Pdf

Para realizar una verificación de un documento pdf firmado, se usará el siguiente método:

AsfService.java /** * Realiza una validación de la firma digital de un documento PDF * @param inPdf datos del pdf firmado a validar * @return SignatureEstatus con el estado de la firma * @throws ServiceException si hubo algún problema */ SignatureStatus validarFirmaPdf(byte[] inPdf) throws ServiceException;

Ejemplo de uso

33 de 41

Framework Atlas Servicio de Certificados // leer pdf de pruebas de disco File f = new File("pdfSignTest.pdf"); byte[] pdf = ... Realizar lectura de fichero ... // firmar pdf pagina 3 PdfSignAppearance apariencia = new PdfSignAppearance(); apariencia.setPage(3); signed = this.asfService.firmarPdf("2w", pdf, false, apariencia); // Validar firma de PDF SignatureStatus status = this.asfService.validarFirmaPdf(signed); log.info("Resultado de la verificacion: " + status);

4.12.

Validación de firma XMLDsig

Para realizar la validación de un documento XML firmado, se usará el siguiente método:

AsfService.java /** * Realiza una validación de la firma digital del documento XML pasado * @param signedXml datos del xml firmado * @return SignatureEstatus con el estado de la firma * @throws ServiceException si hubo algún problema */ SignatureStatus validarFirmaXml(byte[] signedXml) throws ServiceException;

Ejemplo de uso String xml = "" + "Test de firmado XML"; // Firma enveloped String enveloped = this.asfService.firmarXml("2w", xml.getBytes(), "idBody", "head"); // Validar firma SignatureStatus status = this.asfService.validarFirmaXml(enveloped.getBytes()); log.info("Firma OK: " + (SignatureStatus.OK.getId() == status.getId()));

4.13.

Validación de firma XAdES

Para realizar la validación de un documento XML firmado con firma XAdES, se usará el siguiente método:

AsfService.java

34 de 41

Framework Atlas Servicio de Certificados /** * Realiza una validación de la firma digital XAdES del documento XML pasado * @param signedXml datos del xml firmado * @return SignatureEstatus con el estado de la firma * @throws ServiceException si hubo algún problema */ SignatureStatus validarFirmaXades(byte[] signedXml) throws ServiceException;

Ejemplo de uso String xml = "" + "Test de firmado XML"; log.info("Ejecutando firma..."); String xmlFirmado = this.asfService.firmarXadesBes("2w", xml.getBytes()); // Validar firma log.info("Ejecutando validacion..."); SignatureStatus status = this.asfService.validarFirmaXades(xmlFirmado.getBytes()); log.info("Resultado de la validacion: " + status);

4.14.

Extracción de información de firma de un documento XML

Para poder extraer información de un documento XML firmado (y de documentos XML sin firmar) se recomienda utilizar la tecnología XPath. A continuación se muestran métodos de utilidad de la librería de seguridad de ATLAS que facilitan la tarea:

atlas.core.seguridad.util.XmlUtil /** * Convierte un XML en formato String a W3C Document * @param xml String con el documento XML a convertir * @return objeto Document con el XML en formato W3C */ public static Document toDomDocument(String xml) throws ServiceException; /** * Convierte un XML en formato W3C Document a String * @param doc documento en formato W3C * @return String representando al documento XML */ public static String domDocumentToString(Document doc) throws ServiceException;

35 de 41

Framework Atlas Servicio de Certificados /** * Obtiene un motor de XPath precargado con los Namespaces por defecto: * * "ds": "http://www.w3.org/2000/09/xmldsig#" * "soapenv": "http://schemas.xmlsoap.org/soap/envelope/" * "xenc": "http://www.w3.org/2001/04/xmlenc#" * "wsu": "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wsswssecurity-utility-1.0.xsd" * "wsse": "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wsswssecurity-secext-1.0.xsd" * "xades": "http://uri.etsi.org/01903/v1.2.2#" * * @return motor XPath preparado para evaluar expresiones */ public static XPath getXpath(); /** * Obtiene un motor de XPath cargado con los Namespaces por defecto ademas * de los pasados como parametro * @param namespaces lista de namespaces a incluir * @return motor XPath preparado para evaluar expresiones */ public static XPath getXPath(Map namespaces); /** * Evalua una expresion XPath y devuelve el resultado * @param expression String con la expresion XPath * @param doc documento XML sobre el que aplicar la expresion XPath * @return String con el resultado de la consulta * @throws ServiceException si hubo algun problema */ public static String evaluateXpathToString(String expression, Document doc) throws ServiceException; /** * Evalua una expresion XPath y devuelve el resultado * @param expression String con la expresion XPath * @param doc documento XML sobre el que aplicar la expresion XPath * @return lista de nodos seleccionados por la consulta * @throws ServiceException si hubo algun problema */ public static NodeList evaluateXpathToNodeList(String expression, Document doc) throws ServiceException; /** * Evalua una expresion XPath y devuelve el resultado * @param expression String con la expresion XPath * @param doc documento XML sobre el que aplicar la expresion XPath * @return nodo seleccionado por la consulta * @throws ServiceException si hubo algun problema */ public static Node evaluateXpathToNode(String expression, Document doc) throws ServiceException;

Los métodos toDomDocument y domDocumentToString sirven para transformer documentos XML de String a un arbol de nodos y viceversa. Los métodos de firma y validación de XML trabajan con ficheros XML en formato String y el motor de consultas XPath trabaja con árboles de nodos W3C.

36 de 41

Framework Atlas Servicio de Certificados

Los métodos getXPath permiten obtener un motor de consultas XML ya configurado con los Namespaces más comunes, pudiendo especificarse otros no configurados por defecto. Los métodos evaluateXpathTo…, permiten obtener el resultado de una consulta XPath. Ha de conocerse el tipo de resultado que devolverá la consulta y seleccionar el método apropiado. A continuación se muestra un ejemplo de uso:

Ejemplo de uso String xml = "" + "Test de firmado XML"; log.info("Ejecutando firma..."); String xmlFirmado = this.asfService.firmarXadesBes("2w", xml.getBytes()); Document doc = XmlUtil.toDomDocument(xmlFirmado); log.info("Nodo de firma: " + XmlUtil.evaluateXpathToNode("/root/ds:Signature", doc)); log.info("Valor firma enveloped: " + XmlUtil.evaluateXpathToString("//ds:SignatureValue/text()", doc)); log.info("Fecha firma XAdES: " + XmlUtil.evaluateXpathToString("//xades:SigningTime/text()", doc)); log.info("Certificado de firma : " + XmlUtil.evaluateXpathToString("//ds:X509Certificate/text()", doc));

4.15.

Indicar operación no estándar de ASF

Hasta ahora se han visto ejemplos de distintas funcionalidades de servicios de ASF. Todas estas funcionalidades se realizan sobre nombres de operación estándar en la platarforma de firma. Estas son:

Operación ASF

Nombre Estándar

Validación

VALIDACION

Firma digital

FIRMA_SIMPLE

Cifrado

CIFRADO

Descifrado

DESCIFRADO

Descripción Validación de firmas digitales. Firmado digital de datos (binarios, pdf, xml, texto) Cifrado de datos (clave, certificado) Descifrado de datos (clave, certificado)

37 de 41

Framework Atlas Servicio de Certificados

En ocasiones, es necesario crear distintas configuraciones para una operación en una aplicación, por ejemplo:

Nombre Operacion

Operación ASF

Descripción

FIRMA_SIMPLE

Firma digital

Configuración estándar de firma

FIRMA_REGISTRO

Firma digital

Configuración específica de firma

El nombre de operación es comunicado por el equipo de Arquitectura de Aplicaciones cuando se solicita el alta en ASF. A continuación tenemos dos ejemplos de llamada para ejecutar las operaciones de la tabla anterior.

Ejemplo de firmado de texto sobre operación estándar (FIRMA_SIMPLE) String texto = "Texto de ejemplo"; String aliasCertificado = "1r"; // Tiene que estar dado de alta en ASF log.info("Texto original: '" + texto + "'"); // Firmado String firma = null; try { firma = this.asfService.firmar(texto.getBytes(), aliasCertificado); } catch (ServiceException e) { log.error("Error realizando firma.", e); } log.info("Firma: '" + firma + "'");

Vemos que este ejemplo es idéntico a los enunciados anteriormente. Si la operación a ejecutar en ASF tiene el nombre estándar, no es necesario indicarlo ni realizar alguna otra acción.

Atención

En la mayoría de casos no es necesario indicar la operación en ASF.

Ejemplo de firmado de texto sobre operación no estándar (FIRMA_REGISTRO)

38 de 41

Framework Atlas Servicio de Certificados String xml = "Texto de ejemplo"; String aliasCertificado = "1r"; // Tiene que estar dado de alta en ASF log.info("Texto original: '" + texto + "'"); // Firmado String firma = null; try { AsfOperation.setOperationForFirma("FIRMA_REGISTRO"); firma = this.asfService.firmar(texto.getBytes(), aliasCertificado); } catch (ServiceException e) { log.error("Error realizando firma.", e); } log.info("Firma: '" + firma + "'");

Como vemos en el ejemplo, solo es necesario añadir la línea marcada en amarillo antes de ejecutar la operación en ASF. Ha de tenerse en cuenta que especificar un ID de operación distinto al estándar solo sirve para la ejecución de la siguiente operación de ese tipo. En sucesivas llamadas se utilizará el ID estándar de operación, a menos que se indique de nuevo el ID específico antes de la ejecución de otra operación.

Atención Se recomienda indicar el ID de operación inmediatamente antes de la llamada a AsfService, tal y como se muestra en el ejemplo anterior.

A continuación se muestra una tabla con los métodos disponibles para indicar IDs de operación no estándar en ASF.

Operación ASF Verificación

AsfOperation.setOperationForVerificacion(String)

Firma digital

AsfOperation.setOperationForFirma(String)

Cifrado Descifrado

4.16.

Código

AsfOperation.setOperationForCifrado(String) AsfOperation.setOperationForDescifrado(String)

Aplicación de ejemplo

39 de 41

Framework Atlas Servicio de Certificados

Para facilitar en lo posible el uso de la plataforma ASF se ha creado una aplicación de demostración de uso ejemplificando las comunicaciones con el servicio de la librería de seguridad. El acceso al código fuente de esta aplicación está disponible para su estudio en el Portal de Documentación. La estructura de la aplicación se ha simplificado todo lo posible con el objetivo de ayudar a aportar claridad a los ejemplos de uso de la plataforma Asf. Todos los ejemplos de código de este manual han sido tomados de esta aplicación.

40 de 41

Framework Atlas Servicio de Certificados

5. ENLACES RELACIONADOS Producto

URL

Spring

http://www.springframework.org/

ASF

http://gestiona.madrid.org/soja_int/html/web/ASF.htm

Certificados digitales

http://java.sun.com/j2se/1.5.0/docs/guide/security/cert3.html

Demostración de ASF

http://desarrollo.madrid.org/atlasfrm_aplicacion_asf_web

Aplicación de ejemplo

http://www.madrid.org/arquitecturasw/attachments/063_atlasfrmaplicacion-asf.zip

41 de 41