Gracias a Letsencrypt ya es posible obtener certificados SSL, confiables para los principales navegadores, de forma sencilla y gratuita. A continuación explico cómo usarlo.
Participar en el programa BETA
De momento está en fase BETA. Si queremos disponer de certificados firmados por la entidad certificadora de Let’s Encrypt, antes de nada deberemos solicitar entrar en el programa BETA:
Formulario para participar en el programa BETA
En mi caso, tras unas 2–3 semanas, me han contestado que aceptaban mis dominios. Es importante solicitar todos los dominios que necesites desde el inicio. Sino, tendrás que volver a rellenar la solicitud (y volver a esperar).
Descargar el cliente de Letsencrypt
Tras recibir la confirmación, lo primero que hay que hacer es descargarse el cliente, el cual nos ayudará a generar nuestros certificados. Este proceso hay que realizarlo en el mismo servidor donde tenemos nuestra web.
Si no lo tenemos instalado, instalaremos Git
apt-get install git
Después descargaremos el cliente en /opt/letsencrypt
cd /opt/ git clone https://github.com/letsencrypt/letsencrypt cd letsencrypt
Comprobar que funciona correctamente (no te asustes; la primera vez instala todas las dependencias necesarias)
./letsencrypt-auto --help
Obtener los certificados
El cliente de Let’s Encrypt está preparado para obtener los certificados y configurar automáticamente nuestro servidor web (Apache/Nginx), de forma que el proceso sea lo más sencillo posible para el usuario.
Atención: si el Apache o cualquier otro servicio que escuche en el puerto 80/TCP está ejecutándose, tendrás que pararlo momentáneamente hasta terminar el proceso.
Proceso automático para obtener e instalar el certificado en tu web:
./letsencrypt-auto --server https://acme-v01.api.letsencrypt.org/directory
Nota: en el email que nos envían al aceptarnos en la fase Beta, nos indican que hay que incluir el argumento –server API URL. Supongo que tras la fase BETA se podrá omitir.
En mi caso, al ser un sistema en producción y con múltiples virtual hosts configurados en Apache, he preferido realizar el proceso de forma manual (que no es nada complicado).
Proceso manual:
Generamos el certificado para nuestra web
./letsencrypt-auto --agree-dev-preview --server https://acme-v01.api.letsencrypt.org/directory certonly
El script nos preguntará por un email de contacto y el dominio de nuestra página web. Nos dejará los certificados en el siguiente path:
/etc/letsencrypt/live/domain.com/
Si entramos en el directorio, veremos estos ficheros:
cert.pem # Certificado de servidor chain.pem # Certificados necesarios para el navegador privkey.pem # Llave privada (¡no compartir!) fullchain.pem # Todos los certificados
Los tres primeros los utilizaremos en la configuración de Apache. Suponiendo que ya tenemos montado nuestro sitio seguro en Apache con certificados autofirmados, tendremos que utilizar esta configuración para cambiar a nuestros certificados confiables:
# SSL SSLEngine on SSLCertificateFile /etc/letsencrypt/live/domain.com/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/domain.com/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/domain.com/chain.pem BrowserMatch "MSIE [2-6]" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 # MSIE 7 and newer should be able to use keepalive BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
Tras reiniciar el servicio de Apache, nuestro sitio web seguro debería estar en marcha. Compruébalo accediendo a https://dominio.com con tu navegador favorito, o mejor aún, utilizando un test de servidor SSL.
Si en el test observas que tu certificado es confiable, pero te sugiere mejorar la configuración de tu servidor seguro, no olvides desactivar SSLv3 o seguir las recomendaciones de Security Labs.
Hasta aquí todo funcionando correctamente, sin embargo probandolo con firefox me daba error sec_error_unknown_issuer
que indica que el certificado no es confiable, buscando una posible solución encontré que se puede solucionar añadiendo SSLCertificateChainFile apuntando al archivo chain.pem generado por letsencrypt, ejemplo:
SSLCertificateChainFile /etc/letsencrypt/live/domain/chain.pem