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.