Como bien sabemos hay determinados tipos de información que no nos interesa que se transmitan en abierto. Informaciones personales, datos bancarios, cuentas de conexión, datos de nuestros clientes, información confidencial, etc. Sin embargo debemos de recordar que muchos de los protocolos de transmisión de datos lo realizan así.

Pensemos que durante mucho tiempo estos datos simplemente circulaban por cable y dentro de nuestras redes locales o pequeñas corporaciones. Ello no quita que se puedan capturar igualmente, pero siempre supone una mayor complejidad física acceder a nuestra red local ya que debería de poder colarse en nuestra oficina.

Recordemos que desde la aparición de las tecnologías inalámbricas cada vez es más sencillo acceder a estas comunicaciones, y en consecuencia a datos privados y confidenciales. Y sin embargo seguimos teniendo la misma costumbre de no encriptar ni proteger nuestras comuniciones.

Como veremos es muy sencillo generar nuestros propios certificados SSL, suficientes para el trabajo en una red local, Intranet o una pequeña corporación. Mientras no nos dirijamos al público en general tendremos un método suficiente de encriptación utilizando Debian Linux como base.

¿Cómo generar los certificados con OpenSSL?

OpenSSL es un proyecto colaborativo enfocado a implementar seguridad en las comunicaciones tanto comerciales como personales. Para ello podremos utilizar el paquete openssl que de seguro ya tendrás instalado en tu servidor.

Recordemos que uno de los principios del protocolo SSL es que un tercero, ajeno a quien ofrece la información (nosotros y nuestros servidores) y a quien la recibe (los usuarios), es quien certifica la veracidad de nuestros datos y de que somos quienes decimos ser. Algo así como un notario digital, más conocido como Autoridad Certificadora (Certification Authority).

Si alguna vez te has planteado adquirir un certificado habrás observado que en algunos casos son bastante caros, pero merecen la pena cuando realmente estamos ofreciendo un servicio a nuestros clientes. Además garantizan la seguridad de los datos, ofreciendo garantías económicas en caso de fraude.

Sin embargo en nuestro caso y según nuestras necesidades no necesitaremos adquirir dicho certificado sino que nos lo fabricaremos nosotros mismos. Ello implica que nos convirtamos en nuestra propia Certification Authority (CA), con nuestro propio sello, para poder generar nuestros propios certificados.

Generar nuestro certificado de CA

Para todas las operaciones que sigan a continuación deberemos de ejecutarlos como root o con permisos de superusuario con sudo. Almacenaremos nuestros certificados en la carpeta /etc/ssl/own-certs de nuestro equipo.

cd /etc/ssl
mkdir own-certs
cd own-certs

A partir de aquí podemos generar los archivos necesarios de nuestra propia CA, para generar el resto de claves y certificados, para nuestros servicios o dominios y para nuestros propios usuarios.

Por cierto, como cualquier encriptación se vale de una clave con un determinado número de bits que definen la fortaleza de dicha protección. Hoy en día una clave de 1024 o 2048 bits se puede considerar bastante débil, por lo que utilizaremos una clave de 8192 bits.

openssl genrsa -out CA.key 8192

En el segundo comando la consola nos solicitará algunos datos. Ejecutemos el comando.

openssl req -new -key CA.key -out CA.csr

Una vez lanzado el comando nos aparecerán las siguientes preguntas.

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]:Zaragoza
Locality Name (eg, city) []:Zaragoza
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Myself
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:oscargascon.es
Email Address []:me@oscargascon.es
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Obviamente podéis introducir los que consideréis oportuno. En el caso de la contraseña también podéis utilizar la que os parezca, pero recordadla.

Por último generaremos la clave de nuestra CA, para lo cual deberemos de darle también una caducidad en el tiempo. Es mejor no quedarse corto, porque si nos caduca deberemos de volver a generar los certificados. En este caso como véis le he dado una duración de 10 años (3650).

openssl x509 -req -days 3650 -in CA.csr -out CA.crt -signkey CA.key

Finalizado este paso ya tenemos los ficheros necesarios para crear nuestros propios certificados. Sigamos al siguiente paso.

Generemos los certificados SSL para nuestro servidor

Ahora que ya tenemos la autoridad para generar certificados vamos a proceder a ello. Como podemos observar la encriptación sigue siendo de 8192 bits. Por supuesto puedes utilizar el nombre que desees en el fichero de la clave de salida, por lo general el nombre del servidor.

openssl genrsa -out server.key 8192

Y nos vuelve a pedir nuevos datos, esta vez en relación con el servidor y el servicio que vamos a ofrecer.

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]:Zaragoza
Locality Name (eg, city) []:Zaragoza
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySelf
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:*.oscargascon.es             
Email Address []:me@oscargascon.es
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Nuevamente podéis introducir los datos que consideréis oportuno. El más importante es el relativo al Common Name o FQDN. Ahí es donde se define el dominio a proteger. Si pensáis utilizar el certificado como un wildcard, es decir, válido para cualquier servidor en el mismo dominio yo suelo emplear la sintaxis *.dominio.tld para que me sirva para diferentes servidores y/o servicios.

El último paso ya nos permitirá generar el certificado, pero tendremos que crear una serie de ficheros que en Debian son necesarios como paso previo a la generación de cualquier certificado. Si tenéis curiosidad podéis revisar estos ficheros cuando hayáis creado vuestro primer certificado y veréis que se utilizan como referencia y registro de los certificados creados.

mkdir -p demoCA/newcerts
touch demoCA/index.txt
echo 01 > demoCA/serial

Una vez realizados los pasos anteriores que preparan nuestra «fábrica de certificados» ya podemos firmar nuestro server.key. De igual modo podemos darle la duración que queramos. Pongamos por ejemplo dos años.

openssl ca -days 730 -in server.csr -cert CA.crt -keyfile CA.key -out server.crt

A continuación contestamos afirmativamente a las preguntas que nos plantea y ya tenemos generados y firmados nuestros primeros certificados. Pasemos a incluir sus datos en Apache y encriptar las comunicaciones.

Configurando un Virtualhost con Apache y SSL

Es un proceso muy sencillo en Debian. Lo primero que deberemos de hacer es asegurarnos que está activado el módulo SSL en Apache y reiniciar el servicio

a2enmod ssl
service apache2 restart

A continuación crearemos un nuevo VirtualHost, o bien modificaremos el que ya teníamos en funcionamiento para que funcione en el protocolo HTTPS.

<VirtualHost *:443>
  DocumentRoot "/var/www/http-ssl"
  ServerName oscargascon.es
  ServerAlias www.oscargascon.es
  ErrorLog /var/log/error-oscargascon.log
  CustomLog /var/log/access-oscargascon.log combined
  SSLEngine on
  SSLCertificateKeyFile /etc/ssl/own-certs/server.key
  SSLCertificateFile /etc/ssl/own-certs/server.crt
</VirtualHost>

Como puntos importantes hemos cambiado el puerto de escucha al 443 y hemos añadido tres líneas para activar SSL, cargar nuestro certificado y su correspondiente clave para poder encriptar la información. Activaremos el nuevo sitio y a partir de ahora ya podemos entrar a visitar nuestra web con cifrado.

Sin embargo tiene un inconveniente y es que cualquier navegador desconfiará de la información que sirvamos desde dicha web, por lo que deberemos de añadir manualmente una excepción en nuestro navegador para que no nos moleste mientras lo visitamos.

Error de privacidad

Conclusión

Realmente no es una operación difícil la generación de certificados y su implementación. Sobre todo si tenemos en cuenta lo que supone en seguridad contar con comunicaciones encriptadas incluso en nuestra propia red local o intranet.

Tengamos en cuenta que muchos servicios web como el correo electrónico, nuestra intranet y webs internas, etc, siguen funcionando sobre HTTP que es un protocolo abierto y muy vulnerable. Si esto lo unimos a la tecnología wifi y un lugar saturado como un aeropuerto tenemos muchos números de que estemos expuestos al robo de datos.

Espero que os haya sido de utilidad, aunque ya existen bastantes tutoriales al respecto. Personalmente estaría interesado en ver si alguien me puede echar una mano y completar el proceso añadiendo la información de nuestra CA al ordenador cliente y de este modo confie sin tener que añadir una excepción al navegador.

Comparte si te ha gustado

Autor:
Última actualización:

4 comentarios

  1. tengo este error del ultimo comando :

    Using configuration from /etc/pki/tls/openssl.cnf
    /etc/pki/CA/index.txt: No such file or directory
    unable to open ‘/etc/pki/CA/index.txt’
    140518403073864:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen(‘/etc/pki/CA/index.txt’,’r’)
    140518403073864:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400:
    [root@MXMSOTL01NS000 own-certs]#

  2. Hola, tuve que cambiar de la manera que lo tienes tú, las extensiones de crt por key y key por crt sinó no me dejaba iniciar el servicio de apache2.

    No se si es error tuyo o que la versión ha cambiado, pero aún así gracias me ha servido por el resto.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

De acuerdo con lo dispuesto en el Reglamento (UE) 2016/679 de 27 de abril de 2016, consiento que mis datos sean tratados bajo la responsabilidad de Oscar Gascón Arjol para recibir respuesta a consultas. publicación de comentarios del blog y que las conserve mientras haya un interés mutuo para ello. Me doy por informado que tengo derecho a revocar este consentimiento en cualquier momento y a ejercer los de acceso, rectificación, portabilidad y supresión de mis datos y los de limitación y oposición al tratamiento dirigiéndome por email a me@oscargascon.es. También estoy informado de que puedo reclamar ante la autoridad de control a www.agpd.es.