sudo: Jack of all trades, master of some

Generar certificados SSL autofirmados

1 comentario

En muchos de los servicios que administramos día a día necesitamos generar nuestros propios certificados para la comunicación SSL (Secure Sockets Layer). La necesidad de generar nuestros certificados autofirmados está dada principalmente porque para que un certificado sea ‘auténtico’ una autoridad certificadora (CA) debe firmarlos y eso… cuesta dinero. Entonces surge la pregunta: ¿si nuestros certificados no son firmados por una autoridad reconocida, funcionarán de igual manera? Mi respuestá es sí y no, la única diferencia que noto (que empiece el debate), es la incapacidad de los navegadores de reconocer nuestro propio certificado además del horror que viven los usuarios cuando aparece el mensaje de advertencia del certificado ‘no confiable’, aparte de estos dos ‘problemas’ los servicios que lo requieran funcionarán del mismo modo que si lo hicieran con certificados firmados por autoridades auténticas. Hacer uso de certificados autofirmados nos permite que la conexión sea segura y que en la red sea más difícil la captura de paquetes e información sensible. A continuación les presento un paso a paso de cómo crear nuestra propia autoridad certificadora y nuestros propios certificados SSL usando Debian GNU/Linux.

Crear una autoridad certificadora (CA) propia para generar certificados a partir de solicitudes.

El paquete openssl‎ tiene dos scripts para la generación de CAs, CA.pl y CA.sh que son las herramientas recomendadas para este proceso y pueden usarse indistintamente. En este caso nuestros certificados CA y SSL tendrán un tiempo de vida de diez años, el CA se almacenará en /etc/ssl/ca y la llave será RSA de 2048 bits.

Editar el script /usr/lib/ssl/misc/CA.pl

$DAYS="-days 3650";   # 10 años
$CADAYS="-days 3650";   # 10 años
$CATOP=/etc/ssl/ca

Después de la línea que contiene "Making CA certificate ...\n";
Cambiar system ("$REQ -new -keyout " por system ("$REQ -newkey rsa:2048 -keyout ".

Editar el archivo de configuración /etc/ssl/openssl.cnf

dir = /etc/ssl/ca
default_days = 3650
default_bits = 2048

Generación del CA

/usr/lib/ssl/misc/CA.pl -newca
CA certificate filename (or enter to create)

Making CA certificate ...
Generating a 2048 bit RSA private key
............................+++
..........................+++
writing new private key to '/etc/ssl/ca/private/cakey.pem'
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) [AU]:CU
State or Province Name (full name) [Some-State]:Provincia
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Organizacion
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:Nombre
Email Address []:administrador@dominio.tld

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for /etc/ssl/ca/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            fe:60:8b:b2:0e:21:f1:28
        Validity
            Not Before: Oct 21 14:20:41 2013 GMT
            Not After : Oct 19 14:20:41 2023 GMT
        Subject:
            countryName               = CU
            stateOrProvinceName       = Provincia
            organizationName          = Organizacion
            commonName                = Nombre
            emailAddress              = administrador@dominio.tld
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                D1:61:5F:E4:AB:7F:B2:3E:DA:23:1A:7E:FB:B9:C6:5D:02:5A:E7:73
            X509v3 Authority Key Identifier: 
                keyid:D1:61:5F:E4:AB:7F:B2:3E:DA:23:1A:7E:FB:B9:C6:5D:02:5A:E7:73
                DirName:/C=CU/ST=Provincia/O=Organizacion/CN=Nombre/emailAddress=administrador@dominio.tld
                serial:FE:60:8B:B2:0E:21:F1:28

            X509v3 Basic Constraints: 
                CA:TRUE
Certificate is to be certified until Oct 19 14:20:41 2023 GMT (3650 days)

Write out database with 1 new entries
Data Base Updated

Durante el proceso de generación se solicitarán varios datos como el passphrase del PEM, el código del país, el estado o la provincia, localidad, organización, unidad organizacional, nombre, dirección de correo electrónico y por último el passphrase de la llave del CA (cakey.pem).

Dentro del directorio /etc/ssl/ca se generan todos los archivos necesarios para firmar certificados SSL con nuestro propio CA.

Generación de certificados

Normalmente el proceso de generación de certificados consta de tres pasos fundamentales:

  1. Generar la solicitud del certificado
  2. Enviar la solicitud para firmar
  3. Recibir el certificado firmado

Como contamos con nuestro propio CA nosotros mismos seremos los encargados de enviar y firmar los certificados.

Generación de solicitud de certificado CSR (Certificate Signing Request)

Creamos un directorio para almacenar los archivos del certificado y entramos en él:

mkdir /home/usuario/cubava.cu/
cd /home/usuario/cubava.cu

Inmediatamente enviamos el siguiente comando:

/usr/lib/ssl/misc/CA.pl -newreq
Generating a 2048 bit RSA private key
..................+++
...........................+++
writing new private key to 'newkey.pem'
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) [AU]:CU
State or Province Name (full name) [Some-State]:Provincia
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Organizacion
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:*.cubava.cu
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Request is in newreq.pem, private key is in newkey.pem

En el proceso se solicitarán los datos del que solicita la firma del certificado, en este caso el valor más importante es el ‘Common Name‘ que tiene que coincidir con el FQDN de la máquina donde se usará el certificado, en este caso se especificó *.cubava.cu para que pueda ser usado en cualquier máquina dentro del dominio cubava.cu, nótese que de esta manera en un escenario donde se quiera firmar el certificado por una agencia autorizada el costo sería mucho mayor.

Con este comando se generarán los archivos newkey.pem y newreq.pem dentro del directorio /home/usuario/cubava.cu

Firma del CSR con la llave del CA

/usr/lib/ssl/misc/CA.pl -sign
Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for /etc/ssl/ca/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            fe:60:8b:b2:0e:21:f1:29
        Validity
            Not Before: Oct 21 14:40:05 2013 GMT
            Not After : Oct 19 14:40:05 2023 GMT
        Subject:
            countryName               = CU
            stateOrProvinceName       = Provincia
            organizationName          = Organizacion
            commonName                = *.cubava.cu
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                BA:19:C1:2A:F0:0D:5D:58:92:D9:8D:AF:ED:D2:3C:26:40:41:FB:37
            X509v3 Authority Key Identifier: 
                keyid:D1:61:5F:E4:AB:7F:B2:3E:DA:23:1A:7E:FB:B9:C6:5D:02:5A:E7:73

Certificate is to be certified until Oct 19 14:40:05 2023 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
Signed certificate is in newcert.pem

Este comando genera el archivo newcert.pem con el certificado firmado y se deberá usar la contraseña de la llave CA utilizada en el proceso de generación de esta.

Instalación de certificados

Renombrar newkey.pem y newcert.pem por cubava.cu.key y cubava.cu.crt respectivamente y en dependencia de la aplicación moverlos al directorio donde residirán.

Al utilizar una contraseña en la generación del certificado, debemos especificarla cada vez que inicie el servicio que la use, si no queremos este comportamiento y que la aplicación arranque automáticamente debemos quitar la contraseña ejecutando el siguiente comando:

openssl rsa -in newkey.pem -out newkey.sinpass.pem

Donde: newkey.sinpass.pem es la llave sin contraseña.

Permisos

Es importante la aplicación de los permisos correctos para los certificados. El certificado consta de dos archivos, cubava.cu.key y cubava.cu.crt, el primero es la llave que deberá almacenarse en un directorio aparte y tener los permisos más restrictivos posibles. En este caso está almacenado en el directorio ‘private’.

chown root.ssl-cert private
chown root.ssl-cert private/cubava.cu.key
chmod 710 private
chmod 640 private/cubava.cu.key

El archivo cubava.cu.crt es el certificado que debe almacenarse en el directorio especificado por el servicio que lo utilizará y debe tener los siguientes permisos:

chown root.root cubava.cu.crt
chmod 644 cubava.cu.crt
Comentarios desactivados
  1. gracias bro, por eso