Receta para la creación de certificados de prueba desde cero

03/03/2010


Requisitos:

  • Tener instalado OpenSSL
  • Tener instalado la SUN JSDK

Creación de una Autoridad Certificadora:

  1. Genera clave privada de la CA
    openssl dsaparam -out dsaparam.pem 1024
    openssl gendsa -des3 -out private/ca.key dsaparam.pem
  2. Generar una petición de certificado para la propia CA
    openssl req -new -key private/ca.key -out ca.csr
  3. Generar el certificado de la CA firmado por la propia CA
    openssl x509 -signkey private/ca.key -req -days 3650 -in ca.csr -out public/ca.crt

Creación de un certificado de servidor:

  1. Crear un almacén de claves con la clave privada del servidor (en CN especificar el dominio del servidor, ej. dominio.com y el resto dejarlo en blanco)
    keytool -genkey -alias server -keystore private/server.ks -keyalg DSA -sigalg SHA1withDSA
  2. Generar una petición de certificado
    keytool -certreq -alias server -keystore private/server.ks -file server.csr
  3. Generar un certificado firmado por la CA (si existe previamente el fichero “serial.txt” eliminar -CAcreateserial)
    openssl x509 -req -days 360 -in server.csr -CA public/ca.crt -CAkey private/ca.key -CAcreateserial -CAserial serial.txt -out public/server.crt
  4. Importar el certificado del CA en el almacén de claves del servidor
    keytool -import -alias CA -file public/ca.crt -keystore private/server.ks
  5. Importar el certificado del servidor en el almacén de claves
    keytool -import -alias server -file public/server.crt -keystore private/server.ks

Creación de un certificado de cliente (con estructura de DNI electrónico):

  1. Generar la clave privada del cliente
    openssl dsaparam -out dsaparam.pem 1024
    openssl gendsa -des3 -out private/client.key dsaparam.pem
  2. Crear un fichero “dnie.cnf” con el siguiente contenido

    [ req ]
    distinguished_name = req_distinguished_name

    [ req_distinguished_name ]
    countryName = Pais (2 letras)
    countryName_default = ES
    countryName_min = 2
    countryName_max = 2

    commonName = Apellido1 Apellido2, Nombre (AUTENTICACIÓN|FIRMA)
    commonName_max = 64

    givenName = Nombre

    surname = Apellido1

    serialNumber = NNNNNNNNA (número de DNI con letra)
    serialNumber_min = 9
    serialNumber_max = 9

  3. Generar una petición de certificado
    openssl req -config dnie.cnf -new -key private/client.key -out client.csr
  4. Generar un certificado firmado por la CA (si no existe previamente el fichero “serial.txt” añadir -CAcreateserial)
    openssl x509 -req -days 360 -in client.csr -CA public/ca.crt -CAkey private/ca.key -CAserial serial.txt -out public/client.crt
  5. Generar un fichero pkcs12 para importar el certificado en el navegador
    openssl pkcs12 -export -clcerts -in public/client.crt -inkey private/client.key -out private/client.p12 -name your_certificate_client_name

Creación de un truststore (un almacén de claves en el que ir guardar los certificados en los que el servidor “confía”):

  1. Crear un keystore
    keytool -genkey -alias dummy -keyalg DSA -keystore private/truststore.ks
  2. Borrar el alias summy para dejar un keystore “limpio”
    keytool -delete -alias dummy -keystore private/truststore.ks
  3. Importar el certificado del CA (de tal modo que cualquier certificado de cliente firmado por la CA sea válido)
    keytool -import -alias CA -file public/ca.crt -keystore private/truststore.ks

Nota: Para poder consultar los certificados existentes en un keystore podemos utilizar el siguiente comando
keytool -v -list -keystore private/server.ks

Algunos enlaces de interés
How to create a self-signed SSL Certificate …

3 Responses to “Receta para la creación de certificados de prueba desde cero”

  1. juan Says:

    Buen post, solo aclarar q en el punto 1.2: (1-Creación de una Autoridad Certificadora: 2-Generar una petición de certificado para la propia CA)
    Si os da el siguiente error:
    Unable to load config info from /usr/local/ssl/openssl.cnf
    basta con añadir el siguiente parametro: -config openssl.cnf
    Quedaría así:
    openssl req -new -key private/ca.key -out ca.csr -config openssl.cnf

  2. mian Says:

    Gracias por el aporte, que me ha servido mucho.
    Una pregunta, ¿Cuál sería el certificado de servidor que tendría que añadirse en el truststore del cliente para verificar el certificado del servidor?

    Aparece el que se tiene que añadir del cliente, pero no el del servidor, espero que me podáis echar un cable sobre este tema

    Gracias de antemano

  3. Xabe Says:

    Hola

    Estoy intentado configurar un jboss para que use ssl y ademas que la autenticacion sea por certificado en cliente es decir para usar el dni electronico lo unico es no sé como crear mi keystore y importar CA de http://www.dnielectronico.es/seccion_integradores/autoridades_cert.html, es que estoy un poco perdido con esto de los certificados, formatos y etc..

    Gracias de antemano

    Saludos


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: