Los artículos de esta mini-serie son los siguientes:
- Parte I: Instalación y configuración de LEMP Stack
- Parte II: Instalación y configuración de Laravel + Git Hooks
- Parte III: Instalación de certificados SSL gratuitos y ajustes finales de Laravel (Estamos aquí)
Sin más que añadir, continuemos.
Prerrequisitos
- Tener un VPS con una CLI por medio de la cual operar (tal como hemos configurado en los pasos previos de esta mini-serie) ✔️
- Nginx o Apache instalado. Dado que montamos nuestro sitio sobre LEMP stack, ya tenemos Nginx instalado y configurado ✔️
- Un nombre de dominio registrado y operativo. Puedes comprar uno en GoDaddy, Namecheap, Google Domains, entre otros. En mi caso utilizaré un sub-dominio de uno de los dominios que poseo:
site.kennyhorna.com.
¿Qué es Let’s Encrypt?
Para la generación e instalación de nuestros certificados haremos uso de Let’s Encrypt. Sin embargo, antes de usarlo sería bueno que sepamos qué es y qué es lo que hace. Tal como mencionan en su website:
Let’s Encrypt es una autoridad de certificación (AC, o CA por sus siglas en inglés) gratuita, automatizada, y abierta, manejada para el beneficio público. Es un servicio provisto por el Internet Security Research Group (ISRG).
Le damos a las personas los certificados digitales que necesitan para habilitar HTTPS (SSL/TLS) para sitios web, gratuitamente, de la forma más fácil para el usuario en la que podemos. Hacemos esto porque queremos crear una web más segura y respetuosa de la privacidad.
Con todo esto aclarado, comencemos.
1. Apuntando el dominio (o sub-dominio) hacia nuestro servidor
Este paso variará dependiendo de tu gestor de dominios, pero la idea es la misma: crear un “A record” o Registro A que apunte hacia nuestro servidor.
Para el caso de dominios de primer nivel, es recomendable que apuntes tanto la versión con “www” como la versión sin “www”:
- A record en mi-dominio.com apuntando hacia la IP pública de tu servidor.
- A record en www.mi-dominio.com apuntando hacia la IP pública de tu servidor.
En el caso de un sub-dominio, bastará con que lo apuntes hacia la IP pública de tu servidor.
Dado que utilizaré un sub-dominio, y ya que mi dominio (kennyhorna.com) tiene los DNS apuntando hacia los de Netlify, es por medio de esa plataforma por donde apuntaré el sub-dominio hacia mi servidor. En tu caso puedes hacerlo desde donde gestiones tus dominios:
site.kennyhorna.com 3600 IN A 203.0.113.10De este modo, ya habré mapeado el sub-dominio site.kennyhorna.com para que apunte hacia la IP pública de mi servidor: 203.0.113.10.
Si recién has adquirido tu dominio, los DNS pueden tomar hasta 72 horas en propagarse. Si tu dominio ya tiene los DNS propagados, el ajuste de nuevos Registros A es, usualmente, instantáneo, pero puede tomar hasta 45 minutos.
2. Instalando Certbot
Para poder obtener certificados SSL por medio de Let’s Encrypt, necesitaremos instalar Certbot en nuestro servidor.
Dado que este proyecto está en constante desarrollo, necesitamos agregar el repositorio de Certbot a nuestro listado de repositorios a escanear antes de instalarlo. Para esto hacemos:
sudo add-apt-repository ppa:certbot/certbotTendremos que aceptar, apretamos Enter. Paso seguido, actualizaremos la lista de paquetes para recolectar la información de los componentes del nuevo repositorio:
sudo apt updateY finalmente, instalaremos Certbot para Nginx:
sudo apt install python-certbot-nginxConfirmamos con Y, y ahora sí, Certbot está listo para ser usado, pero para configurar el SSL que trabajará con Nginx, necesitaremos verificar la configuración de este.
3. Configurando Nginx
Accedemos a la configuración de nuestro bloque de Nginx. Dado que en la guía utilizamos el que viene por defecto, hacemos:
sudo nano /etc/nginx/sites-available/defaultNos centramos en la línea que especifica el server_name, que, si venimos de los pasos anteriores, estará indicando la IP pública de nuestro servidor, y añadimos el dominio (o sub-dominio) al listado:
root /var/www/laravel/public;index index.php index.html index.htm index.nginx-debian.html;
server_name 203.0.113.10;server_name 203.0.113.10 site.kennyhorna.com;Si en tu caso estás configurando un dominio de primer nivel, deberías añadirlo con y sin “www”:
server_name mi-dominio.com www.mi-dominio.com;Guardamos nuestros cambios y listo.
Para guardar los cambios apretaremos primero
Ctrl+X, luego tipeamosYy por último apretamosEnter.
Ahora vamos a probar nuestra configuración para asegurarnos de que todo marcha bien:
sudo nginx -tSi en caso saltara algún error, vuelve a abrir el archivo en busca de errores tipográficos, guarda tus cambios y prueba reiniciando Nginx:
sudo systemctl reload nginx.
4. Permitiendo conexiones HTTPS a través del firewall
Vamos a necesitar habilitar el corta-fuegos ufw y registrar las reglas necesarias para que permita estas conexiones, pero dado que Nginx registra pocos perfiles, esto es sencillo.
Para verificar si tenemos habilitado o no el ufw hacemos:
sudo ufw statusSi te retorna inactive, necesitaremos activarlo. Para activarlo, hacemos:
sudo ufw enableEn cambio, si en el paso anterior te retornó algo como esto, significará que está activo pero que hay que añadirle las reglas de HTTPS:
Status: active
To Action From-- ------ ----OpenSSH ALLOW AnywhereNginx HTTP ALLOW AnywhereOpenSSH (v6) ALLOW Anywhere (v6)Nginx HTTP (v6) ALLOW Anywhere (v6)Podremos ver el listado de perfiles que podemos aplicarle ejecutando el siguiente comando:
sudo ufw app list
Vamos a añadirle las reglas “Nginx Full”, para esto hacemos:
sudo ufw allow 'Nginx Full'
Si en caso ya lo tenías activo, podrías eliminar las reglas básicas de HTTP mediante
sudo ufw delete allow 'Nginx HTTP'.
IMPORTANTE: En caso hayamos tenido desactivado el firewall desde un inicio, es posible que luego de hacer estos cambios perdamos acceso mediante SSH. Para evitar esto, añadiremos los perfiles de OpenSSH a la lista de reglas permitidas. Para hacerlo ejecutamos:
sudo ufw allow 'OpenSSH'Si todo marchó bien, al ejecutar sudo ufw status debería mostrarnos algo como esto:
Status: active
To Action From-- ------ ----Nginx Full ALLOW AnywhereOpenSSH ALLOW AnywhereNginx Full (v6) ALLOW Anywhere (v6)OpenSSH (v6) ALLOW Anywhere (v6)
5. Obteniendo nuestro certificado SSL
Certbot ofrece distintas maneras para obtener certificados SSL. Al usar el plugin de Nginx que instalamos inicialmente, este se encarga de configurarlo, así como también de recargar la configuración en caso de ser necesario. Entonces procedemos a ejecutar:
sudo certbot --nginx -d tu-dominio.com -d www.tu-dominio.comEn mi caso, al tratarse de un sub-dominio, ejecuté:
sudo certbot --nginx -d site.kennyhorna.comSi es primera vez que configuramos Certbot en ese servidor, nos pedirá que ingresemos una dirección email, la cual será utilizada para comunicar cualquier eventualidad. Escribimos nuestro correo y luego apretamos Enter.
A continuación nos pedirá que aceptemos (o declinemos) sus términos y condiciones. Escribimos A y apretamos Enter.
Luego nos preguntará si queremos compartir nuestro email con una fundación sin fines de lucro asociada a Let’s Encrypt. Escogemos nuestra opción (Y o N) y apretamos Enter.
Por último, nos preguntará si queremos redirigir el tráfico HTTP hacia HTTPS, removiendo el acceso HTTP. Escogemos nuestra opción (1 o 2) y apretamos Enter.
Si todo marchó bien, nos mostrará un mensaje de felicitaciones:
Congratulations! You have successfully enabled https://tu-dominio.comCon esto, tus certificados ya habrán sido transferidos, instalados y cargados. Por lo que si intentamos acceder a nuestro sitio mediante el dominio, veremos que ya podemos acceder a nuestro sitio y que este mostrará el mensaje de que es un sitio seguro:

6. Verificando la renovación automática de nuestro Certificado SSL
Los certificados caducan cada 90 días. Felizmente para nosotros, Certbot tiene una herramienta que nos renueva los certificados automáticamente cada vez que sea necesario. Para probar la configuración de la renovación automática, podemos hacer:
sudo certbot renew --dry-runSi es que no hay ningún problema, nos mostrará un mensaje de éxito.

Si el proceso automático de renovación alguna vez fallase, Let’s Encrypt enviará un mensaje al email que especificamos, alertando que nuestro certificado se encuentra próximo a expirar.
Como nota adicional, podemos verificar la validez de nuestro certificado de la mano de la web SSL Labs.
Para hacerlo, podemos ingresar en nuestro navegador:
https://www.ssllabs.com/ssltest/analyze.html?d=mi-dominio.comEn mi caso, probando con site.kennyhorna.com, el resultado fue una calificación general de A.
🎉🎊 Felicidades 🎊🎉, ya tienes tu Certificado SSL instalado y totalmente gratuito.
7. Actualizando nuestra aplicación Laravel
Ahora vamos a hacer un último ajuste a nuestra aplicación Laravel, para indicarle nuestro nuevo dominio.
Para esto, editaremos nuestro archivo de variables de entorno (.env) que se encuentra en nuestro directorio de proyecto. Para eso accedemos a nuestro directorio:
cd /var/www/laravelPaso seguido editaremos el .env con ayuda de Nano:
nano .envPara finalmente modificar la llave APP_URL, actualizándola con nuestro dominio (o sub-dominio):
APP_NAME="Mi nueva App"APP_ENV=productionAPP_DEBUG=falseAPP_URL=https://site.kennyhorna.comEn caso hayamos guardado en caché nuestra configuración, no olvides correr:
php artisan config:clear.
Cierre
Con estos pasos finales daré por concluida esta mini-serie de artículos enfocados al levantamiento de un servidor que ponga a disposición del mundo nuestro increíble proyecto Laravel.
PD: Si intentas acceder a
site.kennyhorna.com, puede que ya no esté disponible, pues solo fue un sitio temporal que monté para fines de realizar esta guía.
Espero que haya sido de tu agrado 💪😎
Si tienes dudas, comentarios, observaciones y/o correcciones, no dudes en hacérmelas llegar por X.