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
El siguiente paso es poner el servidor en hora.
sudo apt install ntpdate sudo 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
Podemos verificar la deriva en cualquier comento, con los servidores de referencia, ejecutando el 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.
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.