Categorías
18.04 20.04 HowTos RASPBIAN

CA interna (Certification Authority) OpenSSL en Ubuntu

Me pidieron en el trabajo configurar una CA en Ubuntu para poder utilizar certificados firmados en los servicios de nuestras aplicaciones.

Esto nos va a permitir utilizar conexiones SSL (por ejemplo https) con la certeza de estás consumiendo los servicios de un servidor homologado.

Basado en el documento en ingles OpenSSL Certification Authority (CA) on Ubuntu Server de Network https://networklessons.com/ con adecuaciones para que funcionen los certificados en Google Chrome.

Pre-requisitos:

El primer paso es preparar el equipo para llevar adelante este roll. Para esto vamos a proceder en renombrar el servidor a utilizar y configurar el servicio ntp para asegurarse que el servidor este en hora.

Es este caso renombro al servido como ca ( va a ser el ca.enerminds.local, mi empleador actual ).

sudo hostnamectl set-hostname ca

En el archivo /etc/hosts creo el registro para la resolución del nombre local en el loopback.

sudo vi /etc/hosts
Captura de pantalla del archivo /etc/hosts con la línea de resolución «ca».

El siguiente paso es poner el servidor en hora.

sudo apt install ntpdate
sudo ntpdate pool.ntp.org
Captura de pantalla de ejecución de ntpdate pool.ntp.org

Para mantener el servidor en hora vamos a instalar el paquete ntp, que es un servicio que queda corriendo y va corrigiendo el desvío que pueda tener nuestro equipo.

sudo apt install ntp
sudo systemctl start ntp
sudo systemctl status ntp
Captura de pantalla de estado del servicio ntp (running).

Podemos verificar la deriva en cualquier comento, con los servidores de referencia, ejecutando el comando ntpq -p.

Captura de pantalla de la salida comando «ntpq -p «.

Configuración de la CA en Ubuntu:

En los próximos pasos vamos a trabajar como root (yo ya lo venía haciendo de antes en este tutorial pero estaba anteponiendo el «sudo» para no romper con las costumbres).

sudo su -

A continuación vamos a crear la estructura de directorios necesaria para poder gestionar nuestra CA.

mkdir -p /root/ca
cd /root/ca
mkdir newcerts certs crl private requests

Para llevar el registro de los certificados firmados necesitamos crear un archivo auxiliar en el directorio /root/ca llamado «index.txt», «index.txt.attr».

touch /root/ca/index.txt.attr
touch /root/ca/index.txt

También necesitamos generar un número de serie que se utilizará como inicio del numero de serie.

echo $(shuf -i 1000-9999 -n 1) > /root/ca/serial

A continuación voy a proceder a personalizar el openssl.cnf a las necesidades que tengo para crear los certificados.

export servidor="enerminds.local"
cp /usr/lib/ssl/openssl.cnf $servidor.cnf

En el archivo enerminds.local.cnf debemos editar las siguientes líneas según las etiquetas.

En la sección [ CA_default ] modificar la línea donde se define la variable «dir».

dir = /root/ca

Debajo de [ v3_ca ] agregar los siguientes valores.  Esto configura a la CA para firmar los certificados.

[ v3_ca ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = critical, CA:TRUE, pathlen:3
keyUsage = critical, cRLSign, keyCertSign
nsCertType = sslCA, emailCA

En [ v3_req ] agregamos el campo de nombres alternativos (esto permite firmar certificados web que el Chrome / Firefox van a considerar válidos).

[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
#extendedKeyUsage=serverAuth
subjectAltName = @alt_names

Debajo del bloque de la etiqueta [ v3_req ] creamos una nueva etiqueta [ alt_names] con la definición de los dns utilizandos en el dominio.

[ alt_names ]
DNS.1 = ns1.enerminds.local
DNS.2 = ns2.enerminds.local

Descomentar en la sección [ req ] que los requerimientos va a ser creados con la extensión v3.

req_extensions = v3_req

Creo la llave privada de la CA en Ubuntu. En este paso vamos a necesitar una clave para llave de nuestra autoridad. Esta contraseña la tenemos que resguardar.

openssl genrsa -aes256 -out /root/ca/private/cakey.pem 4096
chmod 400 ./private/cakey.pem

Y a continuación creo el certificado de la CA

openssl req -config /root/ca/enerminds.local.cnf -new -x509 -key /root/ca/private/cakey.pem -out cacert.pem -days 3650 -set_serial 0

Procedimiento para crear un certificado firmado.

En este caso necesitamos un certificado para nuestro servidor de monitoreo nagios.enerminds.local. El directorio de trabajo para las nuevas peticiones es /root/ca/requests/. En el primer paso vamos a crear la llave privada, durante esta actividad vamos a tener que definir una contraseña, la misma debe ser única y es necesario resguardarla.

cd /root/ca/
openssl genrsa -aes256 -out ./private/nagios.enerminds.local.pem 2048

Después vamos a crear el archivo .csr que es el que contiene el hash con la solicitud del certificado. La contraseña que se pide en este paso es la que resguardamos en el anterior (te avise que la guardes).

openssl req -config /root/ca/enerminds.local.cnf -new -key ./private/nagios.enerminds.local.pem -out ./requests/nagios.enerminds.local.csr

Y con el archivo de solicitud disponible procedemos a crear el certificado firmado

openssl ca -in ./requests/nagios.enerminds.local.csr \
-out ./certs/nagios.enerminds.local.crt \
-extensions SAN \
-config <(cat /root/ca/enerminds.local.cnf \
<(printf '[SAN]\nsubjectAltName=DNS:nagios.enerminds.local,IP:10.70.254.74')) \
-days 3650

Preparar certificados para uso web (apache2 o nginx)

Si el certificado va a ser utilizado en un servidor web es una incordia tener que ingresar la contraseña de cada certificado cuando inicia o se reinicia el servidor web.

Esto se puede evitar creando certificados pem sin seguridad de PWD. Esto se puede hacer ejecutando los siguientes comandos (esto yo lo hago en el servidor web).

openssl rsa -in ./private/nagios.enerminds.local.pem -out ./private/nagios.enerminds.local.www.pem

Los elementos que hay que copiar al servidor web van a ser en el caso del ejemplo:

  • nagios.enerminds.local.www.pem
  • nagios.enerminds.local.crt

Incorporar la CA al equipo Cliente:

Para que los clientes comen los certificados firmados por nuestra CA como válidos, tenemos que de clarar el certificado de la CA como válido. Esto se realiza ejecutando alguno de los pasos detallados a continuación:

Lo primero que debemos copiar es archivo que esta en /root/ca/cacert.pem al equipo cliente, suponemos que lo dejamos en el /tmp

cd /tmp
openssl x509 -in cacert.pem -inform PEM -out ca.enerminds.local.crt
sudo mkdir -p /usr/share/ca-certificates/extra
sudo mv ca.enerminds.local.crt /usr/share/ca-certificates/extra
sudo dpkg-reconfigure ca-certificates

Firefox

Verificamos accediendo a una url firmada.

Intalación de certificado ca en Chrome / Chromium

Los pasos son muy similares al procedimiento en Firefox. Primero debemos ingresar a settings.

Ingresar a configuración / Settings en Google Chrome.

Dentro de Settings / Configuración se debe acceder a «Privacy and Security» / «Privacidad y Seguridad», click en «More» / «Más» y a continuación «Manage Certificates» / «Administrar Certificados».

Como último paso accedemos al servidor web para verificar la configuración.

Verificamos con Google Chrome el certificado firmado por nuestra CA en Ubuntu.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.