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