martes, 24 de junio de 2014

Cómo crear Certificados SSL autofirmados para uso local

Como todos sabemos, el tráfico en Internet normalmente no va encriptado o protegido. Por lo que cualquier persona, conociendo las técnicas necesarias, puede interceptar nuestras cosas, y aún si consideramos que mucho de lo que enviamos y recibimos a través de Internet no es de importancia para otros, la existencia de los certificados SSL es debido a la necesidad de proteger nuestra información sensible de ser vistas por otros.

Obviamente, debido a los recientes acontecimientos sobre la NSA, los certificados SSL ahora solo nos dan un falso sentido de la seguridad, pero aún así no podemos dejar de usarlos.

El certificado que vamos a crear lo podemos usar ampliamente en nuestro servidor Web local o en Squid para aplicarle técnicas de filtrado (aunque esto no es muy ético).

Crear la llave privada RSA
La herramienta openssl, disponible en nuestro sistema GNU/Linux, es la que usaremos para generar tanto la llave privada RSA y la solicitud de firma de certificado CSR. También lo usaremos para generar el certificado autofirmado que usaremos más adelante.

La llave privada RSA será de 1024 bits encriptada usando Triple-DES y en formado PEM, para que sea leída como texto ASCII.
[fraterneo@rainbow ~]$ openssl genrsa -des3 -out llaveprivada.key 1024
Generating RSA private key, 1024 bit long modulus
..................................++++++
.........................++++++
e is 65537 (0x10001)
Enter pass phrase for llaveprivada.key:
Verifying - Enter pass phrase for llaveprivada.key:
Crear la solicitud de firma de certificado (CSR)
Con la llave privada lista, una solicitud de firma de certificado puede ser generada, la cual se usa de dos maneras. Usualmente el CSR puede ser enviado a una autoridad, como Thawte o Verisign quien verificará la identidad del solicitante y emitirá el certificado firmado. La segunda opción el auto firmar el CSR, lo que haremos en realidad.
[fraterneo@rainbow ~]$ openssl req -new -key llaveprivada.key -out firmacert.csr
Enter pass phrase for llaveprivada.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) [XX]:DO
State or Province Name (full name) []:Santiago
Locality Name (eg, city) [Default City]:Santiago de los Caballeros
Organization Name (eg, company) [Default Company Ltd]:fraterneo   
Organizational Unit Name (eg, section) []:fraterneo
Common Name (eg, your name or your server's hostname) []:rainbow.local
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Eliminar la contraseña de la llave privada
Un efecto colateral no deseado de la llave con la contraseña, es que Apache, y posiblemente otros servicios, va a preguntar por la contraseña cada vez que se inicia su servicio o daemon. En el caso de Squid no debemos eliminarla ya que no funcionará correctamente, y en otros casos es crítico remover esta contraseña, ya que la llave privada queda expuesta si el servidor se ve comprometido. Primero haremos una copia de la misma.
[fraterneo@rainbow ~]$ cp llaveprivada.key llaveprivada.key.org
[fraterneo@rainbow ~]$ openssl rsa -in llaveprivada.key.org -out llaveprivada.key
Enter pass phrase for llaveprivada.key.org:
writing RSA key
Generar el certificado autofirmado
Finalmente, lo que nos atañe: El certificado autofirmado. Pero cuidado: Con este tipo de certificado muchas páginas de Internet no funcionarán correctamente, ya que no es posible validarlas contra este certificado, ya que no está firmado por una Autoridad de Certificados auténtica.

Haremos un certificado bueno para 1 año ó 365 días.
[fraterneo@rainbow ~]$ openssl x509 -req -days 365 -in firmacert.csr -signkey llaveprivada.key -out micertificado.crt
Signature ok
subject=/C=DO/ST=Santiago/L=Santiago de los caballeros/O=rainbow/OU=rainbow/CN=rainbow.local/emailAddress=certad@yahoo.com
Getting Private key
Instalar la llave privada y el certificado
Ahora solo debemos colocarlos en la ruta correspondiente, si tenemos Apache instalado con mod_ssl normalmente esta ruta se encuentra en /usr/local/apache/conf/ o en /etc/httpd/conf.
[fraterneo@rainbow ~]$ sudo cp micertificado.crt /etc/httpd/conf/ssl.crt
[fraterneo@rainbow ~]$ sudo cp llaveprivada.key /etc/httpd/conf/ssl.key
En una próxima entrega veremos cómo usar el proxy Squid para interceptar de forma transparente el tráfico https (puerto 443) y que además será necesario crear la llave privada y el certificado en formato PEM para que puedan ser reconocidos por Squid como llave y certificado válidos. Además de la posibilidad de tener en un mismo fichero tanto la llave privada como el certificado.

6 comentarios:

  1. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  2. Un certificado SSL es una medida de seguridad necesaria y esencial a la hora de proteger el tráfico web y la información de sus clientes. El certificado de seguridad SSL asegura a los visitantes de su página Web que nadie puede ver, interceptar ni alterar los datos que son enviados y recibidos a través de su web.
    Existen varios tipos de certificados SSL según el método de autentificación que se use.
    Verificación de Dominio: Se validará que el dominio para el cual se emitirá el certificado ssl se encuentra registrado por el solicitante.
    Verificación de Organización: También se verificará que la información emitida para el certificado (nombre, ciudad, provincia, pais) sean datos verdaderos.
    Verificación Extendida: Además de las anteriores validaciones, se comprobará la existencia legal de la organización y que la misma aprueba la emisión del certificado.
    Los certificados solo sirven para un único dominio o subdominio, para varios subdominios se deben usar certificados llamados Wildcard.

    ResponderEliminar
  3. Hoy en dia 1024 es insuficiente, minimo 2048

    openssl genrsa -des3 -out llaveprivada.key 1024

    ResponderEliminar
  4. https://letsencrypt.org/

    ResponderEliminar
  5. Necesito crear un certificado para utilizar en una aplizacion desktop que tiene un cliente y un servidor pero cuando creo la llave y el certificado con este codigo... openssl req -x509 -newkey rsa:2048 -keyout server.key -nodes -days 365 -out server.csr y lo cargo en mi aplicacion me muestra el siguiente error: "The host name did not match any of the valid hosts for this certificate". Como solucionar este problema.

    ResponderEliminar
  6. Cree una llave privada y un certificado para utilizar en una aplicacion desktop que tiene un cliente y un servidor con el siguiente codigo openssl req -x509 -newkey rsa:2048 -keyout server.key -nodes -days 365 -out server.csr y cuando las cargos en el codigo y lo compilo me muestra el siguiente error:The host name did not match any of the valid hosts for this certificate. Como puedo resolver esto.

    ResponderEliminar