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.
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.
Autor:
Última actualización:
Muchas gracias por el tuto, ha servido de mucho para darnos una idea de donde empezar.
Ojalá pudieras actualizarlo a la ultima versión de OpenSSL.
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]#
Gracias por tu comentario. El problema claramente es que el fichero /etc/pki/CA/index.txt al que intenta acceder el servidor web no es accesible. O por permisos o porque no es la ruta correcta.
Un saludo.
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.