Post on 11-Jul-2015
MADRID · NOV 21-22 · 2014
Firma electrónicaConceptos e inicio rápido
Tomás García-Merás
Director del proyecto Cliente @firma
clawgrip@hotmail.com
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.
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.
MADRID · NOV 21-22 · 2014
Teoría básica (III)
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();
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”.
MADRID · NOV 21-22 · 2014
Certificados digitales (II)
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.
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
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.
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).
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).
MADRID · NOV 21-22 · 2014
Firmas electrónicas reales (III)
final byte[] sign = new AOCAdESSigner(). sign(
“hola”.getBytes(),
“SHA512withRSA”,
pke.getPrivateKey(),
pke.getCertificateChain(),
extraParams
);
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();
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.).
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
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?
MADRID · NOV 21-22 · 2014
Firma en tres fases
Pre-firma:
Firma:
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).
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/
MADRID · NOV 21-22 · 2014
¡Gracias!clawgrip@hotmail.com