1. MADRID · NOV 21-22 · 2014
Firma electrónica
Conceptos e inicio rápido
Tomás García-Merás
Director del proyecto Cliente @firma
clawgrip@hotmail.com
2. 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.
3. 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.
5. 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();
6. 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”.
7. MADRID · NOV 21-22 · 2014
Certificados digitales (II)
8. Almacenes de claves y certificados (I)
Primeros problemas: El almacén de claves
∘ Dispositivos seguros de creación de firmas (según
MADRID · NOV 21-22 · 2014
norma europea CWA-14169).
∘ Otros almacenes:
· NSS.
· Windows CAPI.
· Llavero de OS X.
· Llavero de iOS.
· Android.
· JKS, BKS, PKCS#12, PKCS#11, etc.
9. Almacenes de claves y certificados (II)
MADRID · NOV 21-22 · 2014
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
10. Almacenes de claves y certificados (III)
MADRID · NOV 21-22 · 2014
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.
11. Firmas electrónicas reales (I)
Huella + cifrado == PKCS#1.
∘ Legalmente no es una firma, técnicamente es la base de cualquier
MADRID · NOV 21-22 · 2014
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).
12. 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
MADRID · NOV 21-22 · 2014
propietarias).
∘ ODF (XMLDSig / XAdES con referencias a medida).
13. Firmas electrónicas reales (III)
MADRID · NOV 21-22 · 2014
final byte[] sign = new AOCAdESSigner(). sign(
“hola”.getBytes(),
“SHA512withRSA”,
pke.getPrivateKey(),
pke.getCertificateChain(),
extraParams
);
14. Firmas electrónicas reales (IV)
final AOKeyStoreManager ksm = AOKeyStoreManagerFactory.getAOKeyStoreManager(
MADRID · NOV 21-22 · 2014
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();
15. 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
16. Trasladando la firma al mundo Web
2
MADRID · NOV 21-22 · 2014
3
Aplicación JavaScript en
Navegador Web Móvil
4
App Nativa
Servidor
intermediario
1
17. 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
MADRID · NOV 21-22 · 2014
cliente / servidor?
18. MADRID · NOV 21-22 · 2014
Firma en tres fases
Pre-firma:
Firma:
19. Recursos a vuestra disposición
dentro del proyecto Cliente @firma
∘ Firmas CAdES, XAdES y PAdES y cualquier firma
MADRID · NOV 21-22 · 2014
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).
20. Recursos a vuestra disposición
dentro del proyecto Cliente @firma
MADRID · NOV 21-22 · 2014
∘ 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/