Self-Signed SSL Certificates

eti
01/28/2009 - 07:32

SSL (Secure Socket Layer) es un protocolo de seguridad desarrollado para lograr que la transmisión de datos cliente/servidor a través de Internet sea mas segura. El SSL es un protocolo abierto, se basa en la utilización de un sistema de cifrado que emplea algoritmos matemáticos y un sistema de claves que solamente conocen el cliente y servidor. Estas claves permiten la encriptación datos, quien a su vez asegura la ilegibilidad de su contenido ante personas no deseadas, en pocas palabras, garantiza que la informacion que viaja entre cliente/servidor sea accesible solo para ambos extremos del canal (o tunel) de comunicación.

Para utilizar el protocolo SSL es necesario que el servidor soporte SSL y posea el certificado digital de seguridad correspondiente, quien deberá ser firmado por una "Autoridad Certificante" (mas conocida como CA o Certificate Authority).

La Autoridad Certificante o CA es el sistema responsable de la emisión de certificados digitales a los usuarios de un sistema que utiliza autenticación basada en certificados digitales. Dichas entidades son, por lo general empresas que se dedican a la creación de estos certificados. Aquí es donde se presentan 2 posibles caminos:

  • Crear una propia entidad certificante que nos permita firmar todos nuestros certificados
  • Realizar un "Pedido de firma de certificado" (Certificate Sign Request, o CSR) y enviarlo alguna empresa dedicada a la firma de certificados SSL (Thawte, Verysing, etc).


Cuando nos conectamos a un servidor que utiliza el protocolo SSL (como ser https://mail.google.com) el servidor se autentica (o valida su identidad) ante el navegador presentando un certificado digital.
Un certificado es la prueba de que un tercero ha verificado la autenticidad del sitio, así como también la identidad de la compañía responsable. Un certificado "válido" le da al los clietes la tranquilidad de estar enviando los datos de manera segura y al lugar deseado. Entendemos por certificado valido, a todo aquel certificado emitido por una entidad certificante "Conocida por el explorador", ya sea porque este conoce "nativamente" a la autoridad certificante o porque hemos importado manualmente el certificado de nuestra propia entidad certificante.

Este tutorial explica como crear los certificados necesarios y firmarlos con una CA propia, y tambien como crear las pedidos de firma de certificado para enviar a una CA (pasos 6 y 7)

## PEM Format

El formato PEM es el mas conocido otorgado por las Entidades Certificantes.
Por lo general tienen extensiones como .pem, .crt, .cer, and .key. Son archivos ASCII codificados con el algoritmo Base64 y contienen

"-----BEGIN CERTIFICATE-----" and "-----END CERTIFICATE-----"

Certificados de servidor, certificados intermedios y claves privadas puede ser puestas en formato PEM.

Apache es un ejemplo the servidores que utilizan el formato PEM. Algunas plataformas soportan el que certificado y la clave privada se encuentren en un mismo archivo, uno debajo del otro, pero la mayoria, como Apache, espera que los certificados y claves se encuentren en archivos separados.

 

Procedimiento:

CREACION DE CERTIFICADOS SSL 

1- Primero vamos a crear los directorios sobre los cuales vamos a trabajar

< mkdir -p /tmp/ssl/keys
< mkdir /tmp/ssl/requests
< mkdir /tmp/ssl/certs
< echo 0 > /tmp/ssl/serial.ca
< cd /tmp/ssl

2- A continuación vamos a generar la clave privada de la Entidad Certificante (Certificate Authority Private Key)

< cd /tmp/ssl/
< openssl genrsa -des3 -out keys/ca.key 1024

NOTA: Deberemos crear una passphrase que debemos recordar/anotar

3- Verificamos la existencia del archivo ca.key (de 1KB aprox) bajo el directorio keys

4- Generar el cetificado Maestro para la Entidad Certificante (CA Master Certificate)

< openssl req -config /etc/ssl/openssl.cnf -sha1  -new -x509 -days 365 \
-key keys/ca.key -out certs/ca.cer


**************************************

Country Name (2 letter code) [GB]:AR
State or Province Name (full name) [Berkshire]:Buenos Aires                         ## Provincia
Locality Name (eg, city) [Newbury]:Capital Federal                                          ## Localidad
Organization Name (eg, company) [My Company Ltd]:MY COMPANY            ## Nombre de la compañía
Organizational Unit Name (eg, section) []:Certificates                                    ## Division
Common Name (eg, your name or your server's hostname) []:MY COMPANY ROOT CA    ## FQDN del servidor, debe ser el FQDN a utilizar sin excepcion
Email Address []:postmaster@server.net                                                       ## Direccion de correo de referencia

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:password1                                    ## Campo Opcional
An optional company name []:MY COMPANY2                     ## Campo Opcional
   
**************************************

5- Verificamos la existencia del archivo ca.cer (de 1KB aprox) bajo el directorio certs

SOLICITUD CSR

6- Generar la clave privada del servidor.

Se recomienda utilizar el FQDN seguido de la extension deseada para identificar correctamente las distintas claves/certificados

< openssl genrsa -out keys/www.server.net.key 1024

Una posibilidad es encriptar esta clave bajo los algoritmos des o 3des, si se opta por esta opcion, se solicitara se ingrese una PASSPHRASE que deberemos recordar para iniciar los servicios que dependan de esta clave. Hay formas de automatizar esto, pero se alejaria un poco del motivo original por el cual se decide encriptar bajo des o triple des, o sea que sea mas seguro.

< openssl genrsa -des -out keys/www.server.net.key 1024 

o

< openssl genrsa -des3 -out keys/www.server.net.key 1024

7- Generar el CSR

< openssl req -new -key keys/www.server.net.key -out requests/www.server.net.csr

**************************************

Country Name (2 letter code) [GB]:AR
State or Province Name (full name) [Berkshire]:Buenos Aires            ## Provincia
Locality Name (eg, city) [Newbury]:Capital Federal                ## Localidad
Organization Name (eg, company) [My Company Ltd]:MY COMPANY            ## Nombre de la compañía
Organizational Unit Name (eg, section) []:Certificates                ## Division
Common Name (eg, your name or your server's hostname) []:www.server.net        ## FQDN del servidor, debe ser el FQDN a utilizar sin excepcion
Email Address []:postmaster@server.net                        ## Direccion de correo de referencia

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:password1                        ## Campo Opcional
An optional company name []:MY COMPANY2                     ## Campo Opcional
   
**************************************

8. Ya tenemos creado el pedido de firma de certificado, este archivo .csr es el que debemos q mandar a la entidad certificante para que sea firmado. En caso de haber optado por Self-Signed Certificates, este archivo es que vamos a firmar a continuación.

FIRMAR CERTIFICADO

9. Firmar el certificado

En este paso es importante tener en cuenta que cada certificado que se firma con esta Entidad Certificante deberá tener un numero serial distinto, es por eso que se crea el archivo /tmp/ssl/serial.ca en el primer paso.

Los pasos a,b,c deben ejecutarse para un mejor control del serial. En el paso "a" se lee el numero de serie actual, en el paso "b" se firma el certificado usando ese numero serial, y en el paso "c" se actualiza dicho serial.

a.

< serial_ca=$(cat /tmp/ssl/serial.ca)

b.

< openssl x509 -sha1 -req -days 365 -in requests/www.server.net.csr -CA certs/ca.cer \
 -CAkey keys/ca.key -set_serial "$serial_ca" -out certs/www.server.net.crt

c.

< if [ $? =  0 ]; then let serial_ca=$serial_ca+1 \
    echo "$serial_ca" > /tmp/ssl/serial.ca ;fi
Distribuir contenido