Creación de una entidad certificadora propia y un certificado autofirmado

Creación de una entidad certificadora propia y un certificado autofirmado.

Para no extenderme demasiado solo enunciaré los comandos y una breve descripción de sus funciones representan.

Por razones de orden creamos un directorio de trabajo llamado CA y dentro de este dos más ,llamados certificados y privado. El primero es donde se guardará una copia de cada certificado que firmemos y en el otro directorio se guardará la llave privada.

#mkdir CA

# cd CA

# mkdir certificados privado

 

Nunca debemos de  perder la llave privada que se generemos, ya que con esta podremos firmar o renovar certificados, y  menos dársela a nadie, ya que toda nuestra seguridad radica en la confidencialidad de la llave privada que se guardará en el directorio privado.

Creamos dos archivos que  formarán la base de datos de los certificados autofirmados.

# echo ’01’ > serial   

# touch index.txt

 

Para no extenderme demasiado solo enunciaré los comandos y una breve descripción de sus funciones representan.

Por razones de orden creamos un directorio de trabajo llamado CA y dentro de este dos más ,llamados certificados y privado. El primero es donde se guardará una copia de cada certificado que firmemos y en el otro directorio se guardará la llave privada.

#mkdir CA

# cd CA

# mkdir certificados privado

 Nunca debemos de  perder la llave privada que se generemos, ya que con esta podremos firmar o renovar certificados, y  menos dársela a nadie, ya que toda nuestra seguridad radica en la confidencialidad de la llave privada que se guardará en el directorio privado.

Creamos dos archivos que  formarán la base de datos de los certificados autofirmados mediante:

 

# echo ’01’ > serial   

# touch index.txt

La información que irá en el certificado es tomado del archivo de configuración, en vez de la línea de comandos. Por lo que hemos de crear uno que llamaremos openssl.cnf y que guardaremos en CA.

Para ello lo podemos crear con:

#nano openssl.cnf

Y en sus contenido podemos esto sin olvidar que lo hemos de adecuar a nuestra organización sobre todo la sección de [ req_distinguished_name ]

# ***** openssl.cnf ******

 

dir           = .    # variable que establece el directorio de trabajo

 

# seccion que permite convertirnos en una CA

# solo se hace referncia a otra sección CA_default

[ ca ]

default_ca    = CA_default

 

[ CA_default ]

serial        = $dir/serial          # archivo que guarda el siguiente número de serie

database      = $dir/index.txt       # archvio que guarda la bd de certificados

new_certs_dir = $dir/certificados    # dir que guarda los certificados generados

certificate   = $dir/cacert.pem      # nombre del archivo del certificado raíz

private_key   = $dir/privado/cakey.pem # llave privada del certificado raíz

default_md    = md5                  # algoritmo de dispersión usado

preserve      = no                   # Indica si se preserva o no el orden de los

                                     #   campos del DN cuando se pasa a los certs.

nameopt       = default_ca           # esta opcion y la siguiente permiten mostrar

                                     #   detalles del certificado 

certopt       = default_ca          

policy        = policy_match         # indica el nombre de la seccion

                                     #   donde se especifica que campos son

                                     #   obligatorios, opcionales y cuales deben ser

                                     #   iguales al certificado raíz

 

# seccion de politicas para la emision de certificados

[ policy_match ]

countryName                 = match          # match, obligatorio

stateOrProvinceName         = match         

organizationName            = match

organizationalUnitName      = optional       # optional, campo opcional

commonName                  = supplied       # supplied, debe estar en la petición

emailAddress                = optional

 

# seccion que indica como los certificados deben ser creados

[ req ]

default_bits       = 1024           # tamaño de la llave, si no se indica 512

default_keyfile    = key.pem        # nombre de la llave privada

default_md         = md5            # algoritmo de dispersión a utilizar

string_mask        = nombstr        # caracteres permitidos en la mascara de la llave

distinguished_name = req_distinguished_name  # seccion para el nombre distinguido (DN)

req_extensions     = v3_req         # seccion con mas extensiones que se añaden a la

                                    #   peticion del certificado

 

# seccion del nombre distinguido, el valor es el prompt que se vera en pantalla.

# datos del propietario del certificado.

# esta seccion define el contenido de datos de id que el certificado llevara.

[ req_distinguished_name ]

0.organizationName          = Nombre de la organizacion

0.organizationName_default  = Nombre de la organización por defecto

organizationalUnitName      = Departamento o division

emailAddress                = Correo electronico

emailAddress_max            = 40

localityName                = Ciudad o distrito

localityName_default        = Localidad

stateOrProvinceName         = Estado o provincia

stateOrProvinceName_default = Provincia_en_cuestion

countryName                 = Codigo del pais (dos letras)

countryName_default         = MX

countryName_min             = 2

countryName_max             = 2

commonName                  = Nombre comun (hostname o IP)

commonName_max              = 64

 

# si en la linea de comandos se indica la opcion -x509,

# las siguientes extensiones tambien aplican

[ v3_ca ]

# indica que se trata de un certificado CA raíz con autoridad para

# firmar o revocar otros certificados

basicConstraints       = CA:TRUE 

                                

# especifica bajo que metodo identificar a la llave publica que sera certificada

subjectKeyIdentifier   = hash    

                                 

# especifica como identifcar la           llave publica                                                                                                                                                           

authorityKeyIdentifier = keyid:always,issuer:always 

                                       

# extensiones de la opcion req

[ v3_req ]

basicConstraints            = CA:FALSE  # los certificados firmados no son CA

subjectKeyIdentifier        = hash

# *************************************************************************************

Para guardarlo Crt+o y salir Crt+x

Por todo ello dentro de nuestro directorio CA debemos de tener algo similar:

#ls -l

drwxr-xr-x  2 root root 4786 mayo 21 15:33 certificados

-rw-r–r–  1 root root    mayo 21 15:33 index.txt

-rwxr–r–  1 root root 4776 mayo 21 15:33 openssl.cnf

drwxr-xr-x  2 root root 4096 mayo 21 15:33 privado

-rw-r–r–  1 root root    mayo 21 15:33 serial

Creando el certificado raíz

Este certificado es el que nos convertirá en una autoridad certificadora, lo primero que nos pedirá es el «pass phrase» que es una contraseña  en forma de una frase. Esta contraseña es importantísima ya que es con la que validaremos nuestra autoridad para después poder crear certificados autofirmados que usaremos en nuestro sitio, por lo que debe ser muy compleja.

Para ello escribimos.

#openssl req -new -x509 -extensions v3_ca -keyout privado/cakey.pem \

-out cacert.pem -days 3650 -config ./openssl.cnf

  • Donde los parametros utilizados significan: eq -new -x509 ( crear un certificado nuevo autofirmado) -extensions v3_ca   ( crear un certificado raíz CA) -keyout     (nombre y donde guardará la llave privada) -out      ( nombre del certificado raíz CA) -days 3650    (el certificado será válido por 3650 días (10 años)) -config         (archivo de configuración a utilizar)
  • Con esto creamos un certificado certificado raíz CA (cacert.pem) y una llave privada (privado/cakey.pem) (La extensión «pem» es de Privacy Enhanced Message)

 

Esta llave privada es importantísima por lo que hemos de guardarla como un tesoro

Podemos consultar información específica del certificado raíz, fechas con este comando.

# openssl x509 -in cacert.pem -noout –dates

Creando un Certificate Signing Request(CSR)(Solicitud de firmado de certificado)

En este paso creamos una llave privada y una solicitud de certificado y firmamos la solicitud para generar un certificado autofirmado.

Escribimos:

openssl req -new -nodes -out antonio-cert.pem -config ./openssl.cnf

Con esto generamos el certificate signing request (csr) llamado antonio-cert.pem y la llave privada llamada key.pem

En caso de que queramos verificar los datos lo podemos hacer por medio de

#openssl req -in antonio-cert.pem -text -verify –noout

La solicitud de certificación (Certificate Request), todavía tiene que ser firmado por una autoridad certificadora CA que somos nosotros mismos.

Firmando el certificado

Para firmarlo necesitaremos indicar la contraseña que autentifique que somos la CA y que introducimos al principio. Escribimos en la terminal

#> openssl ca -out certificado-antonio.pem -config ./openssl.cnf -days 3650 \

-infiles antonio-cert.pem

 La opción ca que indica que firmaremos un certificado como autoridad certificadora (CA) que somos, la salida -out será el archivo certificado-antonio.pem usando las opciones -config del archivo de configuración y la solicitud de firmado se especificó con la opción -infiles que tomó los datos del archivo antonio-cert.pem creado en el paso previo.

Nos pide la contraseña, que es la que se indicó cuando creamos cacert.pem que corresponde a nuestro certificado raíz que nos identifica como CA. El certificado será válido por 10 años -days y después se nos preguntó que si queremos firmarlo, por supuesto que sí, y la última pregunta es por si queremos guardar este certificado ya autofirmado en la base de datos, a lo que también contestamos que sí.

Instalando el certificado y la llave para Apache

Tenemos estos dos elementos ya generados que necesitaremos para Apache:

key.pem    (la llave privada)

certificado-antonio.pem   (Certificado autofirmado)

Nunca debemos de copiarlos dentro del directorio raíz del servicio de Apache como /var/www/ ya que podrías dejar expuestos los archivos a todo el mundo y ser vulnerados.

#mkdir /etc/apache2/certificados

#cp key.pem certificado-antonio.pem /etc/apache2/certificados/

Ahora solo falta copiar los datos dentro del servidor virtual pero para mi caso como no lo he creado y los datos los alojo dentro de /etc/apache2/sites-available/default

#nano /etc/apache2/sites-available/default

Quedando algo como esto:

Distribuir el certificado raíz CA

Para evitar el molesto diálogo que pide aceptar el certificado, la única solución es que distribuir el archivo cacert.pem, que es el me identifica como una autoridad certificadora.

Cuando el usuario lo tenga en su equipo deberá importarlo dentro del browser o navegador. Todos los navegadores en sus preferencias o herramientas tienen una opción de certificados y desde ahí existe un botón importar para realizar esto.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *