[TUTORIAL] Certificado HTTPS ¡GRATIS!

Iniciado por kub0x, 11 Diciembre 2015, 07:46 AM

0 Miembros y 2 Visitantes están viendo este tema.

kub0x

Muy buenas a todos, sé que hace tiempo que no entro al foro pero sigo leyendo todo cada día desde modo invitado.

Hoy os traigo lo mejor de lo mejor, hace algo más de una semana, LetsEncrypt, una iniciativa de la EFF (Electronic Frontier Foundation), anunció su nueva herramienta la cual promueve el uso e instalación de certificados de forma gratuita. Bueno, ya en las charlas de mi git hablé de ello, pero todavía estaban en pañales y bueno ahora está en beta.

Haré una breve introducción del porque es una gran iniciativa que realmente está orientando el control de internet hacia nosotros, los usuarios, ya que la privacidad ahora está de nuestra parte.

INTRODUCCIÓN:

HTTPS se basa en la utilización de PKI + SSL/TLS. A través de estos estándares podemos garantizar la integridad, confiabilidad y la autenticidad de la conexión pertinente, gracias a la criptografía de clave pública y a los certificados X509v3. No os quiero aburrir con tecnicismos, podeís pedirme si quereis un tutorial extendido sobre criptografía asimétrica, TLS, PKI y certificados.

Cuando uno se conecta a una Web mediante HTTPS se realiza una negociación de claves para establecer una conexión segura, uno de los pasos de esta negociación tiene que ver con el certificado. Éste sólo es válido si ha sido firmado por una entidad certificadora (CA), y estas entidades obviamente cobran por certificado emitido, y sí, son cantidad muchas veces desorbitadas.

Gracias a la iniciativa LetsEncrypt podemos obtener un certificado de manera gratuita. ¿Pero, el certificado ya será válido? Sí, al 100%, puesto que el mismo es firmado por una CA de confianza (IdenTrust CA). ¿Y no pierden dinero las otras CA (competencia)? Sí, pero dar este paso era fundamental para retomar el control sobre nuestra privacidad.

Resumiendo, lo que quiero que entendaís es que podeís proteger el tráfico de vuestras Webs personales de ataques Man-In-The-Middle (MITM) sin gastar vuestro dinero en certificados costosos que para colmo hay que pagar por cada renovación del mismo. Esto supone una gran patada al gran hermano amigos.

INSTALACIÓN

Primero, remarcar que la herramienta sólo es empleable por ahora en GNU/Linux, preveen portarla pronto a Windows, pero como bien dije todavía están en Beta.

Para los interesados estoy utilizando CentOs. Abrid vuestra terminal, situaros en el directorio que queraís, descargadla mediante el cliente de git de la siguiente forma y acto seguido corred el cliente letsencrypt-auto para que instale las dependencias auxiliares necesarias (OJO: necesitareís permisos de root):

$ git clone https://github.com/letsencrypt/letsencrypt
$ cd letsencrypt
$ ./letsencrypt-auto

Si no podeis correr el cliente letsencrypt-auto probad a ejecutarlo de la siguiente forma:

$ ./letsencrypt-auto --debug (esto sucede con versiones de Python obsoletas/antiguas.)

USO DE LA HERRAMIENTA

Aquí os explicare el método manual, el cual consiste en generar un par de claves pública/privada además del CSR. El CSR (Certificate Signing Request) es el archivo que contiene la información de nuestra entidad, dominios a proteger, algoritmos de firma digital y nuestra clave pública, que será enviado mediante el cliente de LetsEncrypt a su entidad certificadora (CA) para que nos lo firme y nos devuelva un certificado SSL/TLS.

Existen métodos automatizados que facilitan la obtención del certificado sin tanto rodeo, interesados -> https://letsencrypt.org/howitworks/

Os aviso de antemano que encontrareís MUY POCA info del método manual, todo lo que os voy a explicar a continuación es una recopilación de mi esfuerzo y horas invertidas en este proceso.

Primero generamos nuestro par de claves pública/privada junto al CSR, todo a la vez. En este comando incluiremos la información personal del sitio así como los dominios a proteger:

openssl req -new -newkey rsa:2048 -sha256 -nodes -keyout privkey.pem -out signreq.der -subj "/C=SP/ST=BI/O=NoLucro,S.A./CN=dominio.com" -outform der -reqexts SAN -config <(cat /etc/pki/tls/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:dominio.com,DNS:www.dominio.com,DNS:subdominio.com,DNS:www.subdominio.com"))

Os explico los parámetros:

-newkey: Genera un par de claves, en este caso RSA 2048 bit. También soporta 4096 bit.
-sha256: Algoritmo empleado para la verificación de la firma digital del certificado. Recordad, SHA-1 se considerá inseguro.
-nodes: La clave privada no será cifrada mediante criptografía simétrica.
-keyout: Archivo donde se guardará la clave privada, su contenedor es del tipo .pem.
-out: Archivo donde se guardará el CSR, IMPORTANTÍSIMO que sea .der pues LetsEncrypt no soporta .pem para el CSR.
-subj: Información personal del dueño de nuestra Web (nosotros). "C" es Country (país, 2 letras, SP=España), ST (ciudad, ¿2 letras?, BI=Bilbao), O (organicación), CN (dominio de la web).
-outform der: Como ya he dicho, este comando es fundamental para convertir el CSR en formado .der para que sea reconocible por LetsEncrypt.
-reqexts: Nos permite espicificar más de un dominio para el certificado, así un mismo certificado sirve para varios dominios/subdominios.
SAN: Subject Alter Name, campo del CSR donde podemos especificar más de un dominio, como ya he dicho previamente. Importante incluir los dominios sin www y con www, además de incluir el dominio del campo "CN".

Si todo va bien obtendreís el siguiente output al ejecutar el comando:

Generating a 2048 bit RSA private key
.........................................................................................+++
....................................................+++
writing new private key to 'privkey.pem'
-----


Ahora que tenemos el CSR, necesitamos que la entidad certificadora (CA) de LetsEncrypt nos lo firme con su clave privada, bueno, realmente firma el SHA256 de nuestro certificado y lo incluye en un nuevo campo, y ese resultado es lo que conocemos por certificado x509v3 o certificado SSL/TLS.

Para ello ejecutamos el cliente de LetsEncrypt de la siguiente forma:

./letsencrypt-auto certonly --authenticator manual --email vuestro@email.com --csr signreq.der --text --debug

Bueno no os preocupeis de la cascada de datos que se muestra en pantalla. Llegará un punto en el que el cliente se detenga y os pregunte si le dais consentimiento para almacenar vuestra IP, por seguridad, aceptaís y estareís en la siguiente fase, donde tendremos que provar a LetsEncrypt que somos los dueños de los dominios pertenecientes al CSR. Obtendreís algo como:

Make sure your web server displays the following content at
http://www.dominio.com/.well-known/acme-challenge/XU61P5E-sEefZB5vjllHeQWRpkDs2G_AvlxitI6hOIQ before continuing:

XU61P5E-sEefZB5vjllHeQWRpkDs2G_AvlxitI6hOIQ.BON7JEeVn9miBfADQ34eQIcUTsSTVsHRQqCeXuVUGVs


Simplemente nos dicen que creemos el directorio .well-known/acme-challenge en el directorio raíz de nuestro servidor. Una vez creado, en este ejemplo, crearemos el archivo XU61P5E-sEefZB5vjllHeQWRpkDs2G_AvlxitI6hOIQ con la siguiente cadena dentro XU61P5E-sEefZB5vjllHeQWRpkDs2G_AvlxitI6hOIQ.BON7JEeVn9miBfADQ34eQIcUTsSTVsHRQqCeXuVUGVs. Cuando hayais terminado visitad la URL en vuestro navegador para cercioraros de que la cadena es visible. Una vez completado el proceso presionad ENTER en la terminal donde estaís ejecutando el cliente LetsEncrypt.

Daros cuenta que las cadenas de arriba son un ejemplo, además tendreís que repetir este proceso por cada dominio especificado en el apartado SAN del CSR, ya que por cada dominio tendreís que probar a LetsEncrypt que sois vosotros sus respectivos dueños.

Si la verificación del challenge ha sido satisfactoria obtendreís un mensaje como este:

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
   /home/kub0x/letsencrypt/0001_chain.pem. Your cert will expire on
   2016-03-10. To obtain a new version of the certificate in the
   future, simply run Let's Encrypt again.


Felicidades, ya teneis vuestro propio certificado gratuito firmado por una entidad de confianza, por lo que vuestro certificado es válido en cualquier plataforma, navegador etc. El siguiente paso os lo dejo a vosotros. Si teneis apache simplemente modificad vuestra configuración de VirtualHosts e indicar donde está la clave privada, el certificado que habeís obtenido y la certificate chain, pues sin esta última es imposible verificar que el certificado fue emitido por LetsEncrypt.

PROS:

- Certificado válido bajo cualquier plataforma y firmado por una entidad de confianza (CA), ya que LetsEncrypt delega en IdenTrust, CA (trust-anchor) confiada por todo tipo de plataformas. + info sobre la CA en: https://letsencrypt.org/certificates/
- Renovación del certificado gratuita.
- Dentro de poco implementarán la emisión de certificados mediante la prueba de DNS, junto a la previamente expuesta basada en HTTP.

CONTRAS:

- Se encuentra en fase Beta, por lo que requiere de un conocimiento avanzado (según el modo de instalación) y no está para nada libre de bugs.
- Los certificados tienen que ser renovados cada cierto tiempo, es una política de seguridad para evitar que estén activos largos periodos de tiempo.
- En algunos hostings gratuitos o administrados es necesario deshabilitar el módulo de apache mod_security puesto que obtendremos un error "403 forbidden". En nginx ni idea.
- No se puede obtener un certificado de tipo WildCard, es decir, no emiten certificados del tipo *.dominio.com. por lo que debemos especificar en el campo SAN del CSR todos los dominios a proteger.
- Por ahora no tiene soporte en Windows.

Estaré encantado en responder cualquier cuestión relacionada con el tema. Si me animais a hacer un tutorial sobre certificados, HTTPS, SSL/TLS, RSA e incluso la matemática interna, pues obviamente, lo realizaré muy agusto, pues ahora mi entretenimiento es la criptografía al 100%.

Saludos!
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


RevolucionVegana

Wow pero una cosa a ver si me puedes ayudar porque no estoy muy puesto en esto a ver yo entro a mi panel de control y abro una shell y pongo los comandos que has puesto y ya? es decir es que como no he tocado la shell nunca de mi hosting no me atrevo xDD

Saludos
HAS DICHO ALGO NENAAAAAA?!

kub0x

Cita de: RevolucionVegana en 11 Diciembre 2015, 13:38 PM
Wow pero una cosa a ver si me puedes ayudar porque no estoy muy puesto en esto a ver yo entro a mi panel de control y abro una shell y pongo los comandos que has puesto y ya? es decir es que como no he tocado la shell nunca de mi hosting no me atrevo xDD

Saludos

Buenas. Aunque le tengas miedo merece la pena, eso sí, tienes que ser el dueño del servidor, es decir tienes que tener acceso SSH o bien podrías probarlo que en algunos host gratuitos funciona.

Asegúrate de seguir la gúia hasta el siguiente comando:

openssl req -new -newkey rsa:2048 -sha256 -nodes -keyout privkey.pem -out signreq.der -subj "/C=SP/ST=BI/O=NoLucro,S.A./CN=dominio.com" -outform der -reqexts SAN -config <(cat /etc/pki/tls/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:dominio.com,DNS:www.dominio.com"))

Ves que en la ultima fila pone DNS:dominio.com y DNS:www.dominio.com bueno cambia dominio.com por tu dominio. Ves también que pone CN=dominio.com, ahí también pon el nombre de tu dominio.

Ya habrás generado un CSR que se convertirá en un bonito certificado si le pruebas a LetsEncrypt que realmente eres dueño del dominio que especificaste. Para ello ejecuta el siguiente comando:

./letsencrypt-auto certonly --authenticator manual --email vuestro@email.com --csr signreq.der --text --debug

Saldrán datos de debug por pantalla, no te asustes. Cuando se detenga la cascada de datos te preguntará si no te importa que tu IP sea clasificada por seguridad (tranquilo, LetsEncrypt es software libre, no son piratillas) y escribirás "Y" y le darás a "ENTER".

Ahora te saldrá un mensaje tal que:

Make sure your web server displays the following content at
http://www.dominio.com/.well-known/acme-challenge/XU61P5E-sEefZB5vjllHeQWRpkDs2G_AvlxitI6hOIQ before continuing:

XU61P5E-sEefZB5vjllHeQWRpkDs2G_AvlxitI6hOIQ.BON7JEeVn9miBfADQ34eQIcUTsSTVsHRQqCeXuVUGVs

Si no sabes manejarte en consola simplemente entra por FTP (Filezilla por ejemplo) y crea una carpeta llamada ".well-known" en tu public_html o en donde esté tu index.html para entendernos. Ahora entra a esa nueva carpeta .well-known y crea una carpeta llamada "acme-challenge". Entra a la carpeta "acme-challenge" y crea un archivo llamado "XU61P5E-sEefZB5vjllHeQWRpkDs2G_AvlxitI6hOIQ" y dentro de ese archivo escribe "XU61P5E-sEefZB5vjllHeQWRpkDs2G_AvlxitI6hOIQ.BON7JEeVn9miBfADQ34eQIcUTsSTVsHRQqCeXuVUGVs".

OJO: Esto es un ejemplo, lo único que siempre es igual es la carpeta .well-known/acme-challenge. El archivo y la cadena cambian constantemente, pero bueno, no será muy difícil coger mi ejemplo y cambiarlo un poquito.

Ahora en la terminal donde estabas haciendo el proceso de registro dale a "ENTER". Por cada dominio que pusiste en el comando openssl tendrás que crear un nuevo archivo y poner una cadena, la que ellos te digan.

Si lo haces bien acabarás con el siguiente mensaje:

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
   /home/kub0x/letsencrypt/0001_chain.pem. Your cert will expire on
   2016-03-10. To obtain a new version of the certificate in the
   future, simply run Let's Encrypt again.

En 0001_chain.pem se encuentra tu certificado y la cadena de certificados. Te dejo un tuto de como incluir tu certificado en Apache para mudarte a HTTPS -> https://www.digicert.com/ssl-certificate-installation-apache.htm

Sé que puede parecer enrevesado pero te animo a que lo intentes. Cualquier cosa me dices.

Saludos.
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


RevolucionVegana

Vale lo voy a intentar muchisimas gracias por tomarte tu tiempo para escribir ese pedazo de tocho jeje

Saludos y te digo algo cuando lo haya hecho!!
HAS DICHO ALGO NENAAAAAA?!

Diabliyo

Genial kub0x, actualmente andaba con la idea de comprar con algun entidad Certificadora, ya que tengo sitios de web que necesito mantener la conexion segura.

Saludos !

RevolucionVegana

Kub0x me preguntaba si podrías echarme una mano con un post que publique sobre un href

Saludos
HAS DICHO ALGO NENAAAAAA?!

kub0x

Cita de: Diabliyo en  3 Enero 2016, 05:07 AM
Genial kub0x, actualmente andaba con la idea de comprar con algun entidad Certificadora, ya que tengo sitios de web que necesito mantener la conexion segura.

Saludos !

De nada, espero que te haya servido de ayuda y que hayas ahorrado esos $€ destinados a llenar los bolsillos de las CAs de turno.

Saludos!
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


RevolucionVegana

Cita de: kub0x en 10 Enero 2016, 20:00 PM
De nada, espero que te haya servido de ayuda y que hayas ahorrado esos $€ destinados a llenar los bolsillos de las CAs de turno.

Saludos!

Ahora que ya tengo tiempo voy a ver como hacerlo pero yo desde mi panel no tengo ninguna shell :S
HAS DICHO ALGO NENAAAAAA?!

Diabliyo

kub0x ya he implementado letsencrypt para generar Certificados SSL validos y va de maravilla :D

Ahorita estoy intentando generar otros Certificados pero para cargarlos en postfix.

Saludos !

Diabliyo

El personal de letencrypt a mejorado por mucho como implementar SSL y usando el programa que proporcionan se automatiza todo.

Uso CentOS en mi dedicado y va de maravilla.

Lo unico es que solo dura 3 meses el certificado, hay que entrar a correr el script y renovar los archivos.

Saludos