Title: Seguridad Informtica
1Seguridad Informática
Gestión de Claves Java SE Security Micael.Gallego
_at_urjc.es
Seguridad en Java
2Índice
- Introducción
- Keytool
- API de Gestión de Claves
- Ejemplos
Seguridad en Java
3Introducción
- La gestión de claves es un aspecto difícil
- El problema es que no existe una forma unificada
y universal de gestionar claves - No hay un estándar multiplataforma para almacenar
las claves y los certificados en el sistema
operativo - Los navegadores web (FF, IE) utilizan su propio
mecanismo de gestión de claves y certificados
Seguridad en Java
4Introducción
- Para realizar tareas criptográficas es necesario
usar claves - Claves secretas
- Claves privadas
- Claves públicas en Certificados
- Un sistema de gestión de claves (Key Management
System) permite gestionar claves y certificados - Insertar, borrar, crear, listar claves,
certificados
Seguridad en Java
5Introducción
- Keystore
- El sistema de gestión de claves de Java se basa
en la noción de Almacén de Claves (keystore) - Un keystore es un fichero que almacena claves y
certificados - Gestión del Keystore
- Herramienta de línea de comandos llamada keytool
- Librería Java en la API estándar
- Herramienta gráfica en el Panel de Control Java
Seguridad en Java
6Introducción
7Introducción
- Elementos de un keystore
- Entrada de Clave (Key Entry)
- Clave secreta
- Par asimétrico
- Clave privada y certificado de clave pública
- Se pueden incluir varios certificados encadenados
hasta llegar al certificado de una Autoridad de
Certificación - Entrada de Certificado (Certificate Entry)
- Certificados de confianza
Seguridad en Java
8Introducción
- Cómo nos referimos a una clave o certificado?
- Alias
- Un nombre corto para referirse a las claves y
certificados dentro del keystore - Sólo se aplica dentro del keystore
- Nombre para distinguir (Distinguised Name, DN)
- Es el nombre incluido en un certificado que
indica a quién corresponde la clave pública - Common name (CN), Organization unit (OU),
Organization (O), Location (L), State (S),
Country (C)
Seguridad en Java
9Introducción
- Formatos del un keystore
- JCEKS
- Formato sin restricciones
- Encripta las claves privadas y las claves
secretas fuertemente - Recomendado
- PKCS12
- Formato estándar para importar certificados en
Java - Soportado en Internet Explorer, Firefox, OpenSSL
Seguridad en Java
10Introducción
- Formatos del un keystore
- JKS
- Formato restringido por antiguas limitaciones de
EEUU para la exportación de software de
encriptación - No puede almacenar claves secretas
- Encripta las claves privadas débilmente
- Usado por defecto por compatibilidad
11Introducción
- Certificados de las CA
- Java incorpora algunos de los más importantes
- Fichero JREHOME/lib/security/cacerts
- Password changeit
- No es recomendable modificar este fichero
Seguridad en Java
12Índice
- Introducción
- Keytool
- API de Gestión de Claves
- Ejemplos
Seguridad en Java
13Keytool
- Herramienta de línea de comandos
- JREHOME/bin/keytool.exe
- Funciones
- Crear claves asimétricas
- Generar peticiones de Certificados
- Importar certificados
- Crear certificados
- Modificar y borrar key entries
- Listar el contenido del keystore
Seguridad en Java
14Keytool
- Opciones comunes a cualquier función
- -alias alias
- Nombre corto de la entrada a la que nos referimos
en el comando - Por defecto mykey
- -dname nombreParaDistinguir
- Nombre largo del certificado
- Si se omite se pregunta por pantalla
- -keypass contraseña
- Contraseña del keystore
- Si se omite se pregunta por pantalla
Seguridad en Java
15Keytool
- Opciones comunes a cualquier función
- -keystore nombreFichero
- Localización del fichero de claves (keystore)
- Por defecto HOME/.keystore
- -storepass contraseña
- Contraseña de la entrada particular
- -storetype formatoKeystore
- Formato del keystore
- JKS (por defecto), JCEKS, PKCS12
Seguridad en Java
16Keytool
- Crear una clave asimétrica
- Clave privada y certificado autofirmado de la
clave pública - -genkey
- Opciones
- -keyalg Algoritmo Por defecto DSA, Puede ser RSA
- -keysize TamañoClave Por defecto 1024
- -sigalg AlgoritmoFirma Por defecto SHA1withDSA
- -validity nDias Por defecto 90 días
Seguridad en Java
17Keytool
- Crear una clave asimétrica
C\Program Files\Java\jre1.6.0\bingtkeytool
-genkey -alias MiClave -storetype JCEKS -keyalg
RSA Escriba la contraseña del almacén de
claves Volver a escribir la contraseña
nueva Cuáles son su nombre y su apellido?
Unknown Micael Gallego Carrillo Cuál es el
nombre de su unidad de organización? Unknown
Departamento de Ciencias de la Computación Cuál
es el nombre de su organización? Unknown
Universidad Rey Juan Carlos Cuál es el nombre de
su ciudad o localidad? Unknown
Móstoles Cuál es el nombre de su estado o
provincia? Unknown Madrid Cuál es el
código de país de dos letras de la unidad?
Unknown ES Es correcto CNMicael Gallego
Carrillo, OUDepartamento de Ciencias de la
Compu tación, OUniversidad Rey Juan Carlos,
LMóstoles, STMadrid, CES? no si Escriba
la contraseña clave para ltMiClavegt (INTRO
si es la misma contraseña que la del almacén de
claves) C\Program Files\Java\jre1.6.0\bingt
Seguridad en Java
18Keytool
- Mostrar contenido del keystore
- -list
- Exportar un certificado a un fichero .cer
- -export
- Formato RFC 1421
- Opciones
- -file FicheroCertificado
Seguridad en Java
19Ejercicio 1
- Crear una clave asimétrica (clave pública en
certificado y clave privada) en un nuevo keystore
con la herramiente keytool - Nombre fichero
- HOME/.keystoreUrjc
- El certificado debe estar autofirmado
- El formato será JCEKS
- Exportar el nuevo certificado a un fichero .cer
Seguridad en Java
20Índice
- Introducción
- Keytool
- API de Gestión de Claves
- Ejemplos
Seguridad en Java
21API de Gestión de Claves
- Existe una API para gestionar las claves y los
keystores - Cuando se necesite crear una firma se buscará la
clave privada en un keystore - Se pueden crear claves secretas (con keytool no
se puede) - Cuando se necesite cifrar información en Java se
selecciona la clave privada o secreta de un
keystore
Seguridad en Java
22API de Gestión de Claves
- java.security.KeyStore
- Es un objeto que mantiene en memoria la
información de un keystore - No tiene constructor, se utilizan métodos
estáticos para obtener una instancia - Al obtener una instancia, hay que especificar el
formato del fichero (para que posteriormente se
pueda leer y guardar en ese formato)
KeyStore ks KeyStore.getInstance("JCEKS")
KeyStore ks KeyStore.getInstance(KeyStore.g
etDefaultType())
Seguridad en Java
23API de Gestión de Claves
- Cargar un keystore de disco
KeyStore ks KeyStore.getInstance("JCEKS") char
password new char 'c','h','a','n','g','e',
'i','t' // File keystoreFile new
File(System.getProperty("user.home"), //
".keystore") File
keystoreFile new File(System.getProperty("java.h
ome") "/lib/security",
"cacerts") FileInputStream fis new
java.io.FileInputStream(keystoreFile) ks.load(fi
s, password) fis.close()
Seguridad en Java
24API de Gestión de Claves
- Crear un keystore vacío en memoria
- Util para insertar nuevas claves y guardarle en
disco
KeyStore ks KeyStore.getInstance("JCEKS") char
password new char 'p','a','s','s'
ks.load(null, password)
Seguridad en Java
25API de Gestión de Claves
- Entradas (entry) de un KeyStore
- Representadas por instancias del interfaz
KeyStore.Entry - Cada tipo concreto tiene su subclase
- KeyStore.PrivateKeyEntry Clave privada
- KeyStore.SecretKeyEntry Clave secreta
- KeyStore.TrustedCertificateEntry Certificado de
clave pública
Seguridad en Java
26API de Gestión de Claves
- Listar los Certificados de un keystore
EnumerationltStringgt aliases ks.aliases() while(
aliases.hasMoreElements()) String alias
aliases.nextElement() KeyStore.Entry entry
ks.getEntry(alias, null) System.out.println(en
try)
Para acceder a un certificado no se necesita
contraseña
Seguridad en Java
27API de Gestión de Claves
- Acceso a los Certificados
- Acceso a una clave (privada, pública o secreta)
Certificate cert ks.getCertificate("alias") Cer
tificate certChain ks.getCertificateChain("ali
as")
Key key ks.getKey("alias", new
char'p','a','s','s')
Seguridad en Java
28API de Gestión de Claves
- Otras funcionalidades de la clase KeyStore
- Insertar entradas
- Certificados
- Cadenas de Certificados
- Claves (secretas y privadas)
- Guardar de nuevo a fichero el contenido en
memoria del keystore
Seguridad en Java
29Ejercicio 2
- Crea un programa que cargue un keystore y muestre
su contenido por pantalla - Mostrar el contenido del keystore
- HOME/.keystoreUrjc
Seguridad en Java
30Índice
- Introducción
- Keytool
- API de Gestión de Claves
- Ejemplos
Seguridad en Java
31Ejemplos
- Existen casos de uso típicos en la gestión de
claves y certificados - Crear un certificado desde Java
- Cargar un memoria un certificado desde un fichero
- Guardar en un fichero un certificado
- Incluir un certificado en fichero en un keystore
32Ejemplos
- Crear un certificado desde Java (I)
import sun.security.x509.CertAndKeyGen //
Creación del par de claves // (clave pública y
clave privada) String sigAlgName
"SHA1WithRSA" String keyAlgName "RSA" int
keysize 1024 CertAndKeyGen keypair new
CertAndKeyGen(keyAlgName, sigAlgName,
null) keypair.generate(keysize)
33Ejemplos
- Crear un certificado desde Java (II)
import sun.security.x509.X500Name // Creación
del certificado String commonName "Micael
Gallego Carrillo" String organizationalUnit
"DCC" String organization "URJC" String city
"Móstoles" String state "Comunidad de
Madrid" String country "ES" X500Name
x500Name new X500Name(commonName,
organizationalUnit, organization, city,
state, country)
34Ejemplos
- Crear un certificado desde Java (III)
X509Certificate chain new X509Certificate1
int validity 90 chain0 keypair.getSelfCerti
ficate(x500Name, (long) validity 24 60
60) char keyPass 'p', 'a', 's', 's'
String alias "MyKeyAlias" PrivateKey
privKey keypair.getPrivateKey() // Añadir las
claves y el certificado al keystore ks.setKeyEntry
(alias, privKey, keyPass, chain)
35Ejemplos
- Cargar un memoria un certificado desde un fichero
FileInputStream fr new FileInputStream("C\\fil
es\\certificado.cer") CertificateFactory cf
CertificateFactory.getInstance("X509") X509Cert
ificate c (X509Certificate) cf.generateCertific
ate(fr)
36Ejemplos
- Guardar en un fichero un certificado
X509Certificate cert File file
FileOutputStream out new
FileOutputStream(file) out.write(cert.getEncoded(
)) out.close()
37Ejemplos
- Incluir un certificado en fichero en un keystore
KeyStore ks CertificateFactory cf
CertificateFactory.getInstance("X.509") Certifi
cate certificate cf.generateCertificate( new
FileInputStream("C/files/certificado.cer")) //
Añadir el certificado al keystore String alias
"demoCert" ks.setCertificateEntry(alias,
certificate)