Este artículo explica cómo crear una autoridad certificante raíz (root certification authority) para emitir certificados SSL/TLS para uso dentro de una red privada.

Cuando se requiere proveer SSL/TLS dentro de una red privada, no es posible generar certificados gratuitos con Let's Encrypt ni con ninguna otra entidad certificante. Esto se debe a que, al ser el acceso al servidor destino privado, las entidades no pueden verificar la autenticidad de los nombres de dominio (ya que apuntan a direcciones IP inaccesibles desde Internet). Algunas entidades ofrecen certificados para redes privadas, pero tienen un costo muy elevado. Típicamente las organizaciones utilizan una autoridad certificante (CA) que permita emitir cualquier cantidad de certificados SSL/TLS necesarios para uso en la red local. Luego esta autoridad certificante raíz deberá ser instalada en todos los navegadores de la organización.

Esta configuración permite incluso proveer SSL/TLS cuando el acceso a la red de la organización (LAN) ocurre bajo una VPN.

Veamos a continuación los pasos necesarios para crear una autoridad certificante raíz.

Creación de la CA

Configurar la CA:

root@debian:~# mkdir /etc/ssl/ca-linuxito.com
root@debian:~# cd /etc/ssl/ca-linuxito.com
root@debian:/etc/ssl/ca-linuxito.com# mkdir private req certs newcerts crl
root@debian:/etc/ssl/ca-linuxito.com# cp /etc/ssl/openssl.cnf .
root@debian:/etc/ssl/ca-linuxito.com# chmod 0600 openssl.cnf
root@debian:/etc/ssl/ca-linuxito.com# nano openssl.cnf

Modificar las siguientes variables:

dir             = /etc/ssl/ca-linuxito.com  # Where everything is kept
certificate     = $dir/ca-linuxito.com.crt  # The CA certificate
private_key     = $dir/private/ca-linuxito.com.key  # The private key
default_days    = 730                   # how long to certify for
countryName_default             = AR
stateOrProvinceName_default     = Buenos Aires
localityName_default            = BHI
0.organizationName_default      = linuxito.com
organizationalUnitName_default  = Devops
emailAddress_default            = sistemas@linuxito.com.com

Luego agregar la siguiente línea dentro de la sección [ usr_cert ]:

keyUsage = nonRepudiation, digitalSignature, keyEncipherment

Inicializar el índice y serial:

root@debian:/etc/ssl/ca-linuxito.com# touch index.txt
root@debian:/etc/ssl/ca-linuxito.com# echo '01' > serial

Crear el certificado y clave privada cifrada de la CA:

root@debian:/etc/ssl/ca-linuxito.com# openssl req -config openssl.cnf -new -x509 -extensions v3_ca -keyout private/ca-linuxito.com.key -out ca-linuxito.com.crt
Generating a RSA private key
.........+++++
...........+++++
writing new private key to 'private/ca-linuxito.com.key'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
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) [AR]:
State or Province Name (full name) [Buenos Aires]:
Locality Name (eg, city) [BHI]:
Organization Name (eg, company) [linuxito.com]:
Organizational Unit Name (eg, section) [Devops]:
Common Name (e.g. server FQDN or YOUR name) []:CA linuxito.com
Email Address [sistemas@linuxito.com.com]:

Crear certificados emitidos con la CA

Habiendo creado la CA, ahora es posible emitir certificados firmados por la misma.

Cabe destacar que estos certificados no tendrán validez para uso en Internet, ya que nuestra CA no está firmada por ninguna autoridad certificante de confianza.

Vamos a crear un certificado wildcard para usar en todos los servidores de la red local "lan.linuxito.com".

Editar el archivo de configuración y setear correctamente (debe coincidir con el CN que será ingresado) la variable subjectAltName dentro de la sección [ usr_cert ]:

subjectAltName="DNS:*.lan.linuxito.com.com"

Crear una solicitud de certificado para "*.lan.linuxito.com.com":

root@debian:/etc/ssl/ca-linuxito.com# openssl req -config openssl.cnf -new -nodes -keyout private/star.lan.linuxito.com.com.key -out reqs/star.lan.linuxito.com.com.csr -days 730 -sha256
Ignoring -days; not generating a certificate
Generating a RSA private key
........................................+++++
.+++++
writing new private key to 'private/star.lan.linuxito.com.com.key'
-----
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) [AR]:
State or Province Name (full name) [Buenos Aires]:
Locality Name (eg, city) [BHI]:
Organization Name (eg, company) [linuxito.com]:
Organizational Unit Name (eg, section) [Devops]:
Common Name (e.g. server FQDN or YOUR name) []:*.lan.linuxito.com.com
Email Address [sistemas@linuxito.com.com]:

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

Emitir el certificado:

root@debian:/etc/ssl/ca-linuxito.com# openssl ca -config openssl.cnf -policy policy_anything -out certs/star.lan.linuxito.com.com.crt -infiles reqs/star.lan.linuxito.com.com.csr

Responder 'y' dos veces.

Copiar certificado y clave al servidor destino:

root@debian:/etc/ssl/ca-linuxito.com# tar czf star.lan.linuxito.com.com.tar.gz private/star.lan.linuxito.com.com.key certs/star.lan.linuxito.com.com.crt

Finalmente copiar certificado y clave en el servidor destino e instalarlo y configurarlo según corresponda.

root@servidor:~# mkdir /etc/ssl/linuxito.com/
root@servidor:~# cd /etc/ssl/linuxito.com/
root@servidor:/etc/ssl/linuxito.com# tar xzf /home/sysadmin/star.lan.linuxito.com.com.tar.gz
root@servidor:/etc/ssl/linuxito.com# rm /home/sysadmin/star.lan.linuxito.com.com.tar.gz
root@servidor:/etc/ssl/linuxito.com# mv certs/star.lan.linuxito.com.com.crt .
root@servidor:/etc/ssl/linuxito.com# mv private/star.lan.linuxito.com.com.key .
root@servidor:/etc/ssl/linuxito.com# rmdir certs/ private/
root@servidor:/etc/ssl/linuxito.com# chmod 0400 *

Por ejemplo, si se trata de un servidor web Apache, configurar el sitio modificando las variables SSLCertificateFile y SSLCertificateKeyFile. Guardar los cambios y recargar la configuración del servidor:

root@servidor:/etc/ssl/linuxito.com# service apache2 reload

Desde un navegador, verificar el acceso.

Instalar la CA de linuxito.com en clientes

Los clientes de la LAN deberán instalar el certificado raíz de nuestra CA privada para no tener errores o advertencias de seguridad. A tal fin es conveniente disponer del certificado de nuestra CA en un sitio web accesible desde cualquier navegador en la red local.

Firefox
  1. Descargar el certificado de la CA privada de linuxito.com.
  2. Acceder a "Preferencias" desde el menú de Firefox.
  3. Luego abrir "Ver certificados..." desde las opciones de "Privacidad y seguridad".
  4. Hacer clic en "Importar...".
  5. Seleccionar el archivo descargado en el primer paso.
  6. Tildar ambos casilleros y aceptar (aceptar la CA para todo uso).
Chrome
  1. Descargar el certificado de la CA privada de linuxito.com.
  2. Abrir la configuración de Chrome desde el menú.
  3. Seleccionar ver más en la configuración de privacidad y seguridad.
  4. Abrir gestionar los certificados.
  5. Hacer clic en importar.
  6. Seleccionar el archivo descargado en el primer paso.
  7. Tildar todos los casilleros y aceptar.

Referencias

Compartí este artículo