presentación firma electrónica codemotion 2014

21
MADRID · NOV 21-22 · 2014 Firma electrónica Conceptos e inicio rápido Tomás García-Merás Director del proyecto Cliente @firma [email protected]

Upload: tomas-garcia-mer

Post on 11-Jul-2015

136 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Presentación firma electrónica Codemotion 2014

MADRID · NOV 21-22 · 2014

Firma electrónicaConceptos e inicio rápido

Tomás García-Merás

Director del proyecto Cliente @firma

[email protected]

Page 2: Presentación firma electrónica Codemotion 2014

MADRID · NOV 21-22 · 2014

Teoría básica (I)

Criptografía asímetrica∘ Clave pública – clave privada (RSA, DSA, etc.).

· Lo que cifre con la clave pública solo se podrá descifrar

con la clave privada.

· Aquello que descifre con la clave pública solo ha podido

ser originado a partir de la clave privada.

Huella digital.∘ A partir de un binario de longitud arbitraria se deriva

un binario de longitud fija y acotada.

· No es posible crear un binario que derive una huella digital

dada y una huella corresponde únicamente con un binario.

Page 3: Presentación firma electrónica Codemotion 2014

MADRID · NOV 21-22 · 2014

Teoría básica (II)

Criptografía asímetrica + Huella digital ==

¡Firma Electrónica¡∘ Si cifro la huella digital de un documento con mi

clave pública:

· Solo he podido hacerlo yo, puesto que solo yo tengo

acceso a la clave privada.

· La firma corresponde únicamente a un documento.

Page 4: Presentación firma electrónica Codemotion 2014

MADRID · NOV 21-22 · 2014

Teoría básica (III)

Page 5: Presentación firma electrónica Codemotion 2014

MADRID · NOV 21-22 · 2014

Teoría básica (IV)

final KeyStore ks = KeyStore.getInstance("WINDOWS-MY");

ks.load(null, null);

final PrivateKeyEntry pke = (PrivateKeyEntry) ks.getEntry(

ALIAS,

new KeyStore.PasswordProtection(new char[0])

);

final Signature signature = Signature.getInstance("SHA512withRSA");

signature.initSign(pke.getPrivateKey());

signature.update("Hola Mundo!!".getBytes());

final byte[] mySignature = signature.sign();

Page 6: Presentación firma electrónica Codemotion 2014

MADRID · NOV 21-22 · 2014

Certificados digitales (I)

El par de claves debe ir unívocamente

asociado a un usuario.

El par de claves debe acompañarse de

ciertos metadatos acerca del usuario.

El par de claves debe ser expedido por una

autoridad “de confianza”.

Page 7: Presentación firma electrónica Codemotion 2014

MADRID · NOV 21-22 · 2014

Certificados digitales (II)

Page 8: Presentación firma electrónica Codemotion 2014

MADRID · NOV 21-22 · 2014

Almacenes de claves y certificados (I)

Primeros problemas: El almacén de claves∘ Dispositivos seguros de creación de firmas (según

norma europea CWA-14169).

∘ Otros almacenes:

· NSS.

· Windows CAPI.

· Llavero de OS X.

· Llavero de iOS.

· Android.

· JKS, BKS, PKCS#12, PKCS#11, etc.

Page 9: Presentación firma electrónica Codemotion 2014

MADRID · NOV 21-22 · 2014

Almacenes de claves y certificados (II)

AOKeyStoreManagerFactory.getAOKeyStoreManager(

AOKeyStore.DNIEJAVA, null, "Afirma-DNIe",

AOKeyStore.DNIEJAVA.getStorePasswordCallback(null), null

);

/** Windows / Internet Explorer (CAPI, certificados de usuario). */

WINDOWS

/** Apple Mac OS X / Safari Keychain. */

APPLE

/** PKCS#12. */

PKCS12

/** PKCS#11. */

PKCS11

/** Mozilla / Firefox (NSS / PKCS#11, con módulos de seguridad internos y externos unificados). */

MOZ_UNI

/** DNIe con controlador nativo Java. */

DNIEJAVA

Page 10: Presentación firma electrónica Codemotion 2014

MADRID · NOV 21-22 · 2014

Almacenes de claves y certificados (III)

Más problemas: La

distribución de claves∘ ¿Vía navegador? ¿Tajeta

inteligente? ¿Otros medios?

∘ Protocolos seguros para la

distribución de claves:

SPKAC, PKCS#10, SCEP,

etc.

Page 11: Presentación firma electrónica Codemotion 2014

MADRID · NOV 21-22 · 2014

Firmas electrónicas reales (I)

Huella + cifrado == PKCS#1.∘ Legalmente no es una firma, técnicamente es la base de cualquier

firma electrónica.

PKCS#1 en envoltura ASN.1 con metadatos == CMS /

PKCS#7.∘ No cumple la normativa europea de firma.

CMS con objecto adicional de metadatos == CAdES.∘ Firma avanzada según normativa europea y española

CAdES dentro de un PDF == PAdES.∘ Firma avanzada que el usuario puede ver y validar con software

común (Adobe Reader).

Page 12: Presentación firma electrónica Codemotion 2014

MADRID · NOV 21-22 · 2014

Firmas electrónicas reales (II)

PKCS#1 en envoltura XML con metadatos ==

XMLDSig.∘ No cumple la normativa europea de firma.

XMLDSig con objecto adicional de metadatos ==

XAdES.∘ Firma avanzada según normativa europea y española.

Otros formatos (fuera de normativa).∘ OOXML (XMLDSig / XAdES con objetos y transformaciones

propietarias).

∘ ODF (XMLDSig / XAdES con referencias a medida).

Page 13: Presentación firma electrónica Codemotion 2014

MADRID · NOV 21-22 · 2014

Firmas electrónicas reales (III)

final byte[] sign = new AOCAdESSigner(). sign(

“hola”.getBytes(),

“SHA512withRSA”,

pke.getPrivateKey(),

pke.getCertificateChain(),

extraParams

);

Page 14: Presentación firma electrónica Codemotion 2014

MADRID · NOV 21-22 · 2014

Firmas electrónicas reales (IV)

final AOKeyStoreManager ksm = AOKeyStoreManagerFactory.getAOKeyStoreManager(

AOKeyStore.APPLE,

kc.getAbsolutePath(),

"Mac-Afirma", //$NON-NLS-1$

AOKeyStore.APPLE.getStorePasswordCallback(null),

null

);

final byte[] result = signer.sign(

testPdf,

"SHA512withRSA", //$NON-NLS-1$

pke.getPrivateKey(),

pke.getCertificateChain(),

null

);

final PrivateKeyEntry pke = ksm.getKeyEntry(

"anf usuario activo", AOKeyStore.APPLE.getCertificatePasswordCallback(null)

);

final File saveFile = File.createTempFile("TEST-", ".pdf"); //$NON-NLS-1$ //$NON-NLS-2$

final OutputStream os = new FileOutputStream(saveFile);

os.write(result);

os.flush();

os.close();

Page 15: Presentación firma electrónica Codemotion 2014

MADRID · NOV 21-22 · 2014

Trasladando la firma al mundo Web

No es posible desde JavaScript.∘ ¿Qué pasa entonces con la firma en aplicaciones

Web?

· ¿Necesito Applets de Java? Los Applets de Java

son una pesadilla para usuarios, desarrolladores

e integradores.

Invocación por protocolo∘ Permite la invocación de aplicaciones nativas desde

cualquier navegador en cualquier sistema operativo

(iOS, Windows, Linux, OS X, Android, etc.).

Page 16: Presentación firma electrónica Codemotion 2014

MADRID · NOV 21-22 · 2014

Trasladando la firma al mundo Web

2

3

4

Aplicación JavaScript enNavegador Web Móvil

App Nativa

Servidorintermediario

1

Page 17: Presentación firma electrónica Codemotion 2014

MADRID · NOV 21-22 · 2014

Operación cliente vs. servidor

La custodia personal de la clave privada obliga

a que al menos la firma PKCS#1 se realice en

cliente.∘ ¿Podemos trasladar procesos al servidor?

∘ ¿Qué ventajas obtendríamos en un modo mixto

cliente / servidor?

Page 18: Presentación firma electrónica Codemotion 2014

MADRID · NOV 21-22 · 2014

Firma en tres fases

Pre-firma:

Firma:

Page 19: Presentación firma electrónica Codemotion 2014

MADRID · NOV 21-22 · 2014

Recursos a vuestra disposición

dentro del proyecto Cliente @firma

∘ Firmas CAdES, XAdES y PAdES y cualquier firma

trifásica para Java.

∘ Firmas CAdES y PAdES monofásicas para Android y

cualquier firma trifásica.

∘ Firmas CAdES monofásicas en Objective C para iOS y

OS X y cualquier firma trifásica.

· Código de calidad “cuestionable”.

∘ Firmas CAdES monofásicas en C# para Windows RT.

∘ Gestión de almacenes de claves para Java.

∘ Gestión de almacenes de claves para Android (en

modo Android 4.0, en progreso migración a 4.3).

Page 20: Presentación firma electrónica Codemotion 2014

MADRID · NOV 21-22 · 2014

Recursos a vuestra disposición

dentro del proyecto Cliente @firma

∘ http://svn-

ctt.administracionelectronica.gob.es/svn/clienteafirma/

∘ http://devel.uji.es/sonar/dashboard/index/1993

∘ http://devel.uji.es/hudson/job/afirma-client/

∘ https://github.com/ctt-gob-es/clienteafirma/

∘ https://github.com/guadalinexv9-team/simpleafirma

∘ http://administracionelectronica.gob.es/ctt/

Page 21: Presentación firma electrónica Codemotion 2014

MADRID · NOV 21-22 · 2014

¡[email protected]