Receta para la creación de certificados de prueba desde cero (actualizado)

15/02/2018


Requisitos:

  • Tener instalado OpenSSL 1.0
  • Tener instalado la JDK 1.8

Creación de una Autoridad Certificadora:

  1. Genera clave privada de la CA
    openssl genrsa -des3 -out private/ca-private.key 2048
  2. Generar una petición de certificado para la propia CA
    openssl req -new -key private/ca-private.key -out ca.csr -subj "/C=ES/ST=Asturias/L=Siero/O=RuBeNsA/OU=Departamento Seguridad/CN=rubensa.eu.org"
  3. Generar el certificado de la CA firmado por la propia CA
    openssl x509 -signkey private/ca-private.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
    keytool -genkeypair -keystore private/server.p12 -storetype PKCS12 -alias server -keyalg RSA -keysize 2048 -dname "CN=rubensa.eu.org,OU=Departamento Seguridad,O=RuBeNsA,L=Siero,S=Asturias,C=ES" -ext san=dns:rubensa.eu.org,dns:localhost,ip:127.0.0.1
  2. Generar una petición de certificado
    keytool -certreq -alias server -keystore private/server.p12 -storetype PKCS12 -file server.csr
  3. Generar un certificado firmado por la CA (si existe previamente el fichero “serial.txt” eliminar -CAcreateserial)
    openssl x509 -req -days 365 -in server.csr -CA public/ca.crt -CAkey private/ca-private.key -CAcreateserial -CAserial serial.txt -out public/server.crt
  4. Importar el certificado de la CA en el almacén de claves del servidor
    keytool -import -alias CA -file public/ca.crt -keystore private/server.p12 -storetype PKCS12
  5. Importar el certificado firmado del servidor en el almacén de claves
    keytool -import -alias server -file public/server.crt -keystore private/server.p12 -storetype PKCS12
  6. Exportar la clave privada del servidor
    openssl pkcs12 -in private/server.p12 -nodes -nocerts -out private/server-private.key
  7. Exportar la clave pública del servidor
    openssl rsa -in private/server-private.key -pubout > public/server-public.key

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

  1. Generar la clave privada del cliente
    openssl genrsa -des3 -out private/client-private.key 2048
  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-private.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 365 -in client.csr -CA public/ca.crt -CAkey private/ca-private.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-private.key -out private/client.p12 -name "client"

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
  2. Importar el certificado del CA (de tal modo que cualquier certificado de cliente firmado por la CA sea válido)
    keytool -importcert -alias CA -file public/ca.crt -keystore private/truststore.p12 -storetype PKCS12 -keyalg RSA -keysize 2048

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

Algunos enlaces de interés
Receta para la creación de certificados de prueba desde cero
Steps to generate self-signed PKCS#12 SSL certificate and export its keys

Anuncios
A %d blogueros les gusta esto: