Certificados digitales para dominios locales.

Es habitual que en nuestras casas o empresas despleguemos servicios que necesitamos acceder a ellos vía web y al no estar reconocido el certificado por el navegador, nos aparece una advertencia como la imagen de la cabecera.

Cuando el dominio es público podemos certificarlo mediante Let’s Encrypt, pero si es privado y queremos establecer la comunicación usando el protocolo HTTPS, lo que tenemos que hacer es un certificado autofirmado. O si os gusta cacharrear pueden montar vuestra propia Autoridad Certificadora, CA.

Los servicios de una autoridad de certificación, son principalmente utilizados para garantizar la seguridad de las comunicaciones digitales usando el protocolo TLS utilizados en las comunicaciones web o las comunicaciones de correos electrónicos, así como para resguardar documentos digitales.

Una entidad de confianza, es la responsable de emitir y revocar los certificados, utilizando en ellos la firma electrónica, para lo cual se emplea la criptografía de clave pública. Una autoridad de certificación expide los certificados digitales, que ya contienen las identificaciones numéricas y las contraseñas que se necesitan.

La Autoridad de Certificación verifica la identidad del solicitante de un certificado antes de su expedición.

Los certificados son documentos que recogen ciertos datos de su titular y su clave pública y están firmados digitalmente por la CA, utilizando su clave privada. La CA presta sus Servicios de Certificación que garantiza ante los terceros que, confían en sus certificados y la relación entre la identidad de un usuario y su clave pública.

Instalaremos una CA que reconozca los certificados expedidos para los dominios locales que usaremos en nuestros servidores.

Instalación de Autoridad Certificadora

Especificaciones del servidor:

SO                 Debian Linux
Versión SO         10.5.0
Arquitectura       x64
Número de núcleos  1
Memoria RAM        2 GB.
Tamaño de Disco    20 GB.
Tipo               Virtualizado

Configuración de la CA

Creamos los directorios donde se guardarán los certificados que iremos generando.

# mkdir /etc/ssl/CA
# mkdir /etc/ssl/newcerts

Creamos el fichero que almacenará el número de serie e índice de los certificados.

# sh -c "echo '01' > /etc/ssl/CA/serial"
# touch /etc/ssl/CA/index.txt

Editamos el fichero de configuración de OpenSSL para indicarle los nuevos parámetos.

# nano /etc/ssl/openssl.cnf

Las modificaciones que introduciremos serán los siguientes datos en los campos indicados:

...
[ CA_default ]

dir             = /etc/ssl              # Where everything is kept
database        = $dir/CA/index.txt     # database index file.
...
certificate     = $dir/certs/cacert.pem         # The CA certificate
serial          = $dir/CA/serial           # The current serial number
...
policy          = policy_anything
...

Generamos una clave privada y certificado para nuestro servidor.

# openssl req -new -x509 -extensions v3_ca -keyout cakey.pem -out cacert.pem -days 3650

En la salida de la ejecución del comando anterior, nos pide ingresar la clave que servirá para firmar la expedición de certificados.

Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:

Una vez confirmada la clave, rellenamos la información que tendrá el certificado de la Entidad Autenticadora.

-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]:Gipuzkoa
Locality Name (eg, city) []:Oiartzun
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Dominio Local Networks
Organizational Unit Name (eg, section) []:dominio.local
Common Name (e.g. server FQDN or YOUR name) []:Dominio Local Networks ID Root CA
Email Address []:direccionemail arroba dominio punto com

Los archivos que se han generado debemos moverlos a los directorios de claves privadas y certificados respectivamente.

# ls
# mv cakey.pem /etc/ssl/private/
# mv cacert.pem /etc/ssl/certs/

Solicitud de un certificado desde una estación Linux.

En mi caso voy a certificar el dominio que uso para mi servidor Nagios.

Generamos una clave privada RSA en el servidor solicitante.

# openssl genrsa -out nagios.key 2048

Eliminamos la frase de texto como contraseña de la clave privada.

# openssl rsa -in nagios.key -out nagios.publickey

Generamos una solicitud de certificado usando la clave privada que tenemos

# openssl req -new -key nagios.publickey -out nagios.csr

Rellenamos el formulario con la información que corresponda.

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]:Gipuzkoa
Locality Name (eg, city) []:Oiartzun
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Dominio Local Networks
Organizational Unit Name (eg, section) []:Nagios
Common Name (e.g. server FQDN or YOUR name) []:nagios.dominio.local
Email Address []:direccionemail arroba dominio punto com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Concesión de firma de un certificado

La solicitud que gemos generado en el paso anterior, el fichero nagios.csr, lo pasamos al servidor de la CA y lo firmamos con el siguiente comando.

# openssl ca -in nagios.csr -config /etc/ssl/openssl.cnf

Nos pedirá la frase que ingresamos al configurar el servidor CA

Using configuration from /etc/ssl/openssl.cnf
Enter pass phrase for /etc/ssl/private/cakey.pem:

Y una vez ingresada correctamente, se procederá a la generación del certificado.

Can't open /etc/ssl/CA/index.txt.attr for reading, No such file or directory
...
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Mar  11 14:30:50 2021 GMT
            Not After : Mar  11 14:30:50 2022 GMT
        Subject:
            countryName               = ES
            stateOrProvinceName       = Gipuzkoa
            localityName              = Oiartzun
            organizationName          = Dominio Networks
            organizationalUnitName    = Nagios
            commonName                = nagios.dominio.local
            emailAddress              = direccionmail arroba dominio punto local
...
-----BEGIN CERTIFICATE-----
MIIEaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQsFADCBvzELMAkGA1UEBhMCRVMx
ETAPBgNVBAgMCEdpcHV6a29hMREwDwYDVQQHDAhPaWFydHp1bjEeMBwGA1UECgwV
VHJhbnNOYXR1ciBOb3J0ZSBTLkwuMRkwFwYDVQQLDBB0cmFuc25hdHVyLmxvY2Fs
...
s7z/tgSKKAMZHEYpqnWXIlbp6hzjey0vfZYl9yjVitYOQZggYZhqcSLBdWav7ULs
LLnQZVqJQNVmWyp7zBsG2ACJN0j6lV9bmQewEw==
-----END CERTIFICATE-----
Data Base Updated

Podemos visualizar todo el contenido del certificado generado, en la siguiente ruta:

# cat /etc/ssl/newcerts/01.pem

Desde aquí lo moveremos al servidor solicitante en nuestro caso el servidor Nagios para que haga uso de él.

Ya en el servidor Nagios, movemos los ficheros a los respectivos directorios y en caso de no existir, los creamos.

# mv 01.pem /etc/ssl/certs/nagios.pem
# mv nagios.key /etc/ssl/private/

Ahora procedemos a instalar los módulo SSL.

# yum install -y mod_ssl openssl

Editamos el fichero de configuración SSL que se nos ha creado, para indicarle las rutas de los certificados a usar.

# nano /etc/httpd/conf.d/ssl.conf

Y buscamos y editamos las siguientes claves ubicando las rutas de los ficheros que acabamos de mover:

...
SSLCertificateFile  /etc/ssl/certs/nagios.pem
...
#SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
SSLCertificateKeyFile /etc/ssl/private/nagios.key

Reiniciamos el servicio httpd.

# systemctl stop httpd
# systemctl start httpd

Y ya tenemos configurado nuestro servidor con SSL.

Instalación de certificado CA en el navegador

Para que nuestro navegador o cualquier otro navegador lo reconozca, debemos de importar el certificado que hemos generado en la CA a dicho navegador. Lo encontramos en la siguiente ruta:

/etc/ssl/certs/cacert.pem

Para instalarlo en Firefox vamos al menú Configuración, Preferencias, Privacidad y Seguridad. Al final de la sección encontramos un botón que indica «Ver certificados…», clickamos en él.

Nos ubicamos en la pestaña Autoridades y clickamos en el botón importar. Seleccionamos el fichero cacert.pem y nos saltará una ventana advirtiéndonos de que vamos a confiar en una nueva Autoridad Certificadora.

Seleccionamos los dos propósitos que nos indica y clickamos en Aceptar.

Con esto, ya tenemos una autoridad en nuestro navegador que reconozca los certificados autogenerados para nuestros servidores locales.

Podemos generar cuantos certificados necesitemos para los dominios locales que tengamos. De esta manera aseguramos que la información intercambiada entre nuestro navegador y los servicios solicitados, vaya siempre cifrada aunque sólo sea para uso local. Uno nunca sabe quién puede estar escuchando en la red }:)

Tener presente que los certificados autogenerados SÓLO los reconocerán aquellos navegadores donde hayamos instalado el certificado de la Autoridad Certificadora, ya que es ella quien los ha expedido.

Espero que con esta sencilla guía, se animen a certificar los dominios locales que tengan en vuestras casas/empresas.

Saludos =)