13
ElevenPaths, innovación radical y disruptiva en seguridad

Integración de SealSign BSS en Aplicaciones Java

Embed Size (px)

Citation preview

Page 1: Integración de SealSign BSS en Aplicaciones Java

ElevenPaths, innovación radical y disruptiva en seguridad

Page 2: Integración de SealSign BSS en Aplicaciones Java

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 2 de 13

Contenidos

1 Introducción ............................................................................................................... 3

2 Tareas comunes .......................................................................................................... 4

2.1 Generación de Proxies de los Servicios Web ............................................................................ 4

2.2 Inclusión del Cliente SealSignDSSClientLibrary ......................................................................... 6

3 Casos de uso ............................................................................................................... 7

3.1 Enumeración de Certificados del Usuario ................................................................................ 7

3.2 Verificación de Certificados ...................................................................................................... 7

3.3 Firma con Certificado en el Servidor ........................................................................................ 8

3.4 Firma con Certificado en el Cliente........................................................................................... 8

3.4.1 Enumeración de Certificados ..................................................................................................... 8

3.4.2 Inicio de Firma ............................................................................................................................ 9

3.4.3 Criptografía en Cliente................................................................................................................ 9

3.4.4 Fin de Firma ................................................................................................................................ 9

3.5 Firma con document provider (Documento en el Servidor) .................................................. 10

3.5.1 Enumeración de Certificados ................................................................................................... 10

3.5.2 Inicio de la Firma ...................................................................................................................... 10

3.5.3 Criptografía en Cliente.............................................................................................................. 11

3.5.4 Fin de la Firma .......................................................................................................................... 11

3.6 Verificación de documentos firmados .................................................................................... 11

4 Recursos .................................................................................................................... 12

Page 3: Integración de SealSign BSS en Aplicaciones Java

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 3 de 13

1 Introducción

SealSign DSS es un producto desarrollado por ElevenPaths. Dirigido a facilitar la integración de la firma electrónica en las aplicaciones corporativas. SealSign DSS expone su funcionalidad a través de Servicios Web basados en la tecnología WCF (Windows Communication Framework). Estos servicios pueden ser invocados por aplicaciones implementadas sobre la mayoría de las tecnologías del mercado.

Este documento no pretende ser un manual sobre los aspectos concretos de la firma electrónica sino un manual de referencia técnica, orientado al desarrollador, sobre cómo integrar SealSign DSS en Aplicaciones Java.

Page 4: Integración de SealSign BSS en Aplicaciones Java

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 4 de 13

2 Tareas comunes

2.1 Generación de Proxies de los Servicios Web

Para interactuar con la plataforma servidora se hace uso de la capa de servicios Web. El documento “SealSign DSS - Referencia de Servicios Web” detalla cada servicio y sus parámetros. En este apartado se muestra, a modo de ejemplo, cómo incluir en un proyecto cliente las clases necesarias para invocar a dichos servicios. Para este propósito se utilizará el motor Axis2 del que se pueden encontrar referencias en esta dirección: http://axis.apache.org/axis2/java/core/, pero es posible utilizar cualquier otro método de invocación (KSOAP, raw, etc.).

Hay que añadir el soporte Axis2 en las propiedades del proyecto para acceder a la autogeneración.

Imagen 01: Propiedades del proyecto en Eclipse.

A continuación iniciamos el asistente de generación del cliente del servicio Web:

Imagen 02: Asistente para crear el cliente del Servicio Web en Eclipse.

Page 5: Integración de SealSign BSS en Aplicaciones Java

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 5 de 13

Es recomendable utilizar Axis2 como runtime de servicios Web ya que resuelve muchos problemas de integración con servicios WCF, utilizados por la plataforma SealSign:

Imagen 03: Utilización de Axis2 como runtime.

Por último, se muestra la ventana de confirmación. En el caso de que el servicio publicase varios endpoint (Basic, WS, etc.), es importante seleccionar el adecuado en función de la autenticación requerida y además los parámetros de conexión necesarios:

Imagen 04: Configuración del cliente del Servicio Web.

Page 6: Integración de SealSign BSS en Aplicaciones Java

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 6 de 13

2.2 Inclusión del Cliente SealSignDSSClientLibrary

Para incluir las funciones de criptografía en el cliente de la plataforma es necesario añadir la referencia a la librería SealSignDSSClientLibrary en el Build Path del proyecto:

Imagen 05: Adición de la librería externa SealSignDSSClientLibrary.jar.

Page 7: Integración de SealSign BSS en Aplicaciones Java

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 7 de 13

3 Casos de uso

3.1 Enumeración de Certificados del Usuario

Para enumerar certificados es necesario que las solicitudes al servicio vayan autenticadas desde el cliente, de forma que se asegure el uso de certificados permitidos. El servicio consumido es el /SealSignDSSService/SignatureServiceBasic.svc.

En el siguiente ejemplo se realiza la conexión al servicio mediante Axis2 y se obtiene un array de CertificateReference. Cada objeto contiene información relativa a cada certificado que el usuario puede utilizar. Los valores retornados y la sintaxis del método se pueden consultar en el documento “SealSign DSS - Referencia de Servicios Web”:

SignatureServiceBasicStub service = new SignatureServiceBasicStub(); HttpTransportProperties.Authenticator basicAuthentication = new HttpTransportProperties.Authenticator(); basicAuthentication.setUsername("SealSignTest"); basicAuthentication.setPassword("Passw0rd"); basicAuthentication.setPreemptiveAuthentication(true); service._getServiceClient().getOptions().setProperty(org.apache.axis2.transport.http.HTTPConstants.AUTHENTICATE, basicAuthentication); GetCertificateReferences getParameters = new GetCertificateReferences(); GetCertificateReferencesResponse getResponse = service.getCertificateReferences(getParameters); ArrayOfCertificateReference referencesResult = getResponse.getGetCertificateReferencesResult(); CertificateReference[] references = referencesResult.getCertificateReference(); if (references != null && references.length > 0) { // Server certificate signing CertificateReference reference = references[0];

3.2 Verificación de Certificados

Para comprobar la validez de un certificado se realiza una única llamada al método Validate. El servicio consumido es el /SealSignDSSService/CertificateServiceBasic.svc. Los valores retornados y la sintaxis del método se pueden consultar en el documento “SealSign DSS - Referencia de Servicios Web”:

// BeginSignature using Axis2 stub CertificateServiceBasicStub service = new CertificateServiceBasicStub(); java.security.cert.Certificate certificate = ks.getCertificate(alias); DataHandler certificateDH = new DataHandler(new ByteArrayDataSource(certificate.getEncoded())); Validate validateParameters = new Validate(); validateParameters.setValidatingCertificate(certificateDH); ValidateResponse validateResponse = service.validate(validateParameters);

Page 8: Integración de SealSign BSS en Aplicaciones Java

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 8 de 13

3.3 Firma con Certificado en el Servidor

La firma con certificado y clave privada en el servidor (HSM, BBDD) se realiza con una sola llamada al servicio Web de firma, pasando el documento a firmar y los parámetros necesarios. El servicio consumido es el /SealSignDSSService/SignatureServiceBasic.svc.

El certificado con el que se firma se especifica mediante su ID en la plataforma. Los valores retornados y la sintaxis del método se pueden consultar en el documento “SealSign DSS - Referencia de Servicios Web”:

// Server certificate signing CertificateReference reference = references[0]; Sign signParameters = new Sign(); signParameters.setSignatureProfile(SignatureProfile.PDF); signParameters.setSignatureType(SignatureType.Default); signParameters.setHashAlgorithm(HashAlgorithm.Default); signParameters.setIdCertificate(reference.getId()); SignatureFlags signatureFlags = new SignatureFlags(); signatureFlags.setSignatureFlags_type0(new SignatureFlags_type0[] { SignatureFlags_type0.Default }); signParameters.setOptions(signatureFlags); DataHandler signingDocumentDH = new javax.activation.DataHandler(new FileDataSource("y:\\proyectos\\sealsign\\samples\\sample.pdf")); signParameters.setSigningDocument(signingDocumentDH); SignResponse signResponse = service.sign(signParameters); DataHandler signedDocument = signResponse.getSignResult(); File graphFile = new File("y:\\proyectos\\sealsign\\samples\\sample.pdf.signed.pdf"); FileOutputStream outputStream = new FileOutputStream(graphFile); signedDocument.writeTo(outputStream);

3.4 Firma con Certificado en el Cliente

Para firmar con un certificado cuya clave privada reside en el cliente, se realizan tres pasos:

1. Se notifica a la plataforma la parte pública del certificado que se va a utilizar y el documento a firmar.

2. Con los datos obtenidos del servidor (instancia y token de firma) se realiza la operación criptográfica mediante la librería cliente SealSignDSSClientLibrary.

3. Se notifica el resultado de la operación criptográfica a la plataforma para finalizar la operación de firma y componer el documento final.

3.4.1 Enumeración de Certificados Para enumerar los certificados disponibles se utilizan los recursos habituales del entorno, de forma independiente a la plataforma SealSign:

// Certificate enumeration from PFX

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

KeyStore ks = KeyStore.getInstance("pkcs12");

ks.load(new FileInputStream(new File("C:\\Temp\\FNMT.pfx")), "1234".toCharArray());

Page 9: Integración de SealSign BSS en Aplicaciones Java

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 9 de 13

for (Enumeration<String> e = ks.aliases(); e.hasMoreElements();)

{

String alias = e.nextElement();

// Certificate selection based on private key

if (ks.isKeyEntry(alias))

{

3.4.2 Inicio de Firma Se notifica el inicio de firma a la plataforma servidora mediante la llamada al método BeginSignature. El servicio consumido es el /SealSignDSSService/DistributedSignatureServiceBasic.svc.

Los valores retornados y la sintaxis del método se pueden consultar en el documento “SealSign DSS - Referencia de Servicios Web”:

// BeginSignature using Axis2 stub

DistributedSignatureServiceBasicStub service = new

DistributedSignatureServiceBasicStub();

java.security.cert.Certificate certificate = ks.getCertificate(alias);

DataHandler certificateDH = new DataHandler(new

ByteArrayDataSource(certificate.getEncoded()));

SignatureFlags signatureFlags = new SignatureFlags();

signatureFlags.setSignatureFlags_type0(new SignatureFlags_type0[] {

SignatureFlags_type0.Default });

DataHandler signingDocumentDH = new javax.activation.DataHandler(new

FileDataSource("y:\\proyectos\\sealsign\\samples\\sample.pdf"));

BeginSignature beginParameters = new BeginSignature();

beginParameters.setCertificate(certificateDH);

beginParameters.setSignatureProfile(SignatureProfile.PDF);

beginParameters.setSignatureType(SignatureType.Default);

beginParameters.setHashAlgorithm(HashAlgorithm.Default);

beginParameters.setOptions(signatureFlags);

beginParameters.setSigningDocument(signingDocumentDH);

BeginSignatureResponse beginResponse = service.beginSignature(beginParameters);

DistributedSignatureBeginResponseBasic beginResult =

beginResponse.getBeginSignatureResult();

3.4.3 Criptografía en Cliente Mediante la llamada al componente AsyncStateManager se realiza la operación criptográfica con la clave privada del certificado elegido previamente:

ByteArrayOutputStream asyncStateStream = new ByteArrayOutputStream(); beginResult.getAsyncState().writeTo(asyncStateStream); PrivateKey key = (PrivateKey)ks.getKey(alias, "1234".toCharArray()); // Client encryption with SealSignDSSClientLibrary AsyncStateManager manager = new AsyncStateManager(asyncStateStream.toByteArray()); byte[] finalAsyncState = manager.doFinal(key);

3.4.4 Fin de Firma Se notifica a la plataforma el fin de la firma y se obtiene el documento final. El servicio consumido es el /SealSignDSSService/DistributedSignatureServiceBasic.svc. Los valores retornados y la sintaxis del método se pueden consultar en el documento “SealSign DSS - Referencia de Servicios Web”:

Page 10: Integración de SealSign BSS en Aplicaciones Java

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 10 de 13

javax.activation.DataHandler finalAsyncStateDH = new javax.activation.DataHandler(new ByteArrayDataSource(finalAsyncState)); EndSignature endParameters = new EndSignature(); endParameters.setInstance(beginResult.getInstance()); endParameters.setAsyncState(finalAsyncStateDH); // EndSignature using axis2 stub and signed document return EndSignatureResponse endResponse = service.endSignature(endParameters); DataHandler signedDocument = endResponse.getEndSignatureResult(); File graphFile = new File("y:\\proyectos\\sealsign\\samples\\sample.pdf.signed.pdf"); FileOutputStream outputStream = new FileOutputStream(graphFile); signedDocument.writeTo(outputStream);

3.5 Firma con document provider (Documento en el Servidor)

El procedimiento de firma con un document provider es similar al de firma con certificado en cliente, con la diferencia de que el documento no tiene por qué estar en el cliente. En su lugar, se especifica una URI que el documento provider utilizará para obtener el documento de un Backend documental en la parte servidora.

3.5.1 Enumeración de Certificados Para enumerar los certificados disponibles se utilizan los recursos habituales del entorno, de forma independiente a la plataforma SealSign:

// Certificate enumeration from PFX

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

KeyStore ks = KeyStore.getInstance("pkcs12");

ks.load(new FileInputStream(new File("C:\\Temp\\FNMT.pfx")), "1234".toCharArray());

for (Enumeration<String> e = ks.aliases(); e.hasMoreElements();)

{

String alias = e.nextElement();

// Certificate selection based on private key

if (ks.isKeyEntry(alias))

{

3.5.2 Inicio de la Firma Se notifica el inicio de firma a la plataforma servidora mediante la llamada al método BeginSignatureProvider. El servicio consumido es el /SealSignDSSService/DistributedSignatureService Basic.svc. Los valores retornados y la sintaxis del método se pueden consultar en el documento “SealSign DSS - Referencia de Servicios Web”:

// BeginSignatureProvider using Axis2 stub

DistributedSignatureServiceBasicStub service = new DistributedSignatureServiceBasicStub(); java.security.cert.Certificate certificate = ks.getCertificate(alias); DataHandler certificateDH = new DataHandler(new ByteArrayDataSource(certificate.getEncoded())); BeginSignatureProvider beginProviderParameters = new BeginSignatureProvider(); beginProviderParameters.setCertificate(certificateDH); beginProviderParameters.setUri("demo://y:\\proyectos\\sealsign\\samples\\sample.pdf");

Page 11: Integración de SealSign BSS en Aplicaciones Java

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 11 de 13

BeginSignatureProviderResponse beginProviderResponse = service.beginSignatureProvider(beginProviderParameters); DistributedSignatureBeginResponseBasic context = beginProviderResponse.getBeginSignatureProviderResult();

3.5.3 Criptografía en Cliente Mediante la llamada al componente AsyncStateManager se realiza la operación criptográfica con la clave privada del certificado elegido previamente:

ByteArrayOutputStream asyncStateStream = new ByteArrayOutputStream(); context.getAsyncState().writeTo(asyncStateStream); PrivateKey key = (PrivateKey)ks.getKey(alias, "1234".toCharArray()); // Client encryption with SealSignDSSClientLibrary AsyncStateManager manager = new AsyncStateManager(asyncStateStream.toByteArray()); byte[] finalAsyncState = manager.doFinal(key);

3.5.4 Fin de la Firma Se utiliza para notificar a la plataforma el fin de la firma. El servicio consumido es el /SealSignDSSService/DistributedSignatureServiceBasic.svc. Los valores retornados y la sintaxis del método se pueden consultar en el documento “SealSign DSS - Referencia de Servicios Web”:

javax.activation.DataHandler finalAsyncStateDH = new javax.activation.DataHandler(new ByteArrayDataSource(finalAsyncState)); EndSignatureProvider endProviderParameters = new EndSignatureProvider(); endProviderParameters.setInstance(context.getInstance()); endProviderParameters.setUri("demo://y:\\proyectos\\sealsign\\samples\\sample.pdf"); endProviderParameters.setAsyncState(finalAsyncStateDH); // EndSignatureProvider using axis2 stub and signed document return EndSignatureProviderResponse endResponse = service.endSignatureProvider(endProviderParameters);

3.6 Verificación de documentos firmados

Para verificar las firmas contenidas en un documento se realiza una única llamada al método Verify de la plataforma servidora. El servicio consumido es el /SealSignDSSService/SignatureServiceBasic.svc. Los valores retornados y la sintaxis del método se pueden consultar en el documento “SealSign DSS - Referencia de Servicios Web”:

// Signature verification DataHandler signedDocumentDH = new javax.activation.DataHandler(new FileDataSource("y:\\proyectos\\sealsign\\samples\\sample.pdf.signed.pdf")); Verify verifyParameters = new Verify(); verifyParameters.setSignatureProfile(SignatureProfile.PDF); verifyParameters.setDocument(signedDocumentDH); VerifyResponse verifyResponse = service.verify(verifyParameters); SignatureVerification signatureVerification = verifyResponse.getVerifyResult(); VerificationResult verificationResult = signatureVerification.getResult();

Page 12: Integración de SealSign BSS en Aplicaciones Java

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 12 de 13

4 Recursos

Para información acerca de los distintos servicios de SealSign puede accederse a esta dirección: https://www.elevenpaths.com/es/tecnologia/sealsign/index.html

Además en el blog de ElevenPaths es posible encontrar artículos interesantes y novedades acerca de este producto.

Puede encontrarse más información acerca de los productos de Eleven Paths en YouTube, en Vimeo y en Slideshare.

Page 13: Integración de SealSign BSS en Aplicaciones Java

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 13 de 13

La información contenida en el presente documento es propiedad de Telefónica Digital Identity & Privacy, S.L.U. (“TDI&P”) y/o de cualquier otra entidad dentro del Grupo Telefónica o sus licenciantes. TDI&P y/o cualquier compañía del Grupo Telefónica o los licenciantes de TDI&P se reservan todos los derechos de propiedad industrial e intelectual (incluida cualquier patente o copyright) que se deriven o recaigan sobre este documento, incluidos los derechos de diseño, producción, reproducción, uso y venta del mismo, salvo en el supuesto de que dichos derechos sean expresamente conferidos a terceros por escrito. La información contenida en el presente documento podrá ser objeto de modificación en cualquier momento sin necesidad de previo aviso.

La información contenida en el presente documento no podrá ser ni parcial ni totalmente copiada, distribuida, adaptada o reproducida en ningún soporte sin que medie el previo consentimiento por escrito por parte de TDI&P.

El presente documento tiene como único objetivo servir de soporte a su lector en el uso del producto o servicio descrito en el mismo. El lector se compromete y queda obligado a usar la información contenida en el mismo para su propio uso y no para ningún otro.

TDI&P no será responsable de ninguna pérdida o daño que se derive del uso de la información contenida en el presente documento o de cualquier error u omisión del documento o por el uso incorrecto del servicio o producto. El uso del producto o servicio descrito en el presente documento se regulará de acuerdo con lo establecido en los términos y condiciones aceptados por el usuario del mismo para su uso.

TDI&P y sus marcas (así como cualquier marca perteneciente al Grupo Telefónica) son marcas registradas. TDI&P y sus filiales se reservan todo los derechos sobre las mismas.

PUBLICACIÓN:

Junio 2015

En ElevenPaths pensamos de forma diferente cuando hablamos de seguridad. Liderados por Chema Alonso, somos un equipo de expertos con inquietud para replantearnos la industria y gran experiencia y conocimiento en el sector de la seguridad. Dedicamos toda nuestra experiencia y esfuerzos en crear productos innovadores para que la vida digital sea más segura para todos.

La evolución de las amenazas de seguridad en la tecnología es cada vez más rápida y constante. Por eso, desde junio de 2013, nos hemos constituido como una start-up dentro de Telefónica para trabajar de forma ágil y dinámica, y ser capaces de transformar el concepto de seguridad anticipándonos a los futuros problemas que afecten a nuestra identidad, privacidad y disponibilidad online.

Con sede en Madrid, estamos presentes también en Londres, EE.UU, Brasil, Argentina, y Colombia.

TIENES ALGO QUE CONTARNOS, PUEDES HACERLO EN:

elevenpaths.com Blog.elevenpaths.com @ElevenPaths Facebook.com/ElevenPaths YouTube.com/ElevenPaths