En el grupo Hablemos de Laravel de Facebook me pidieron si podía hacer un tutorial de como configurar HTTPS en Laravel y Nginx. Me pareció muy buena idea ya que es algo clave que debemos hacer si nos dedicamos a hacer sitios web con Laravel.
¡Comencemos con el tutorial! 🤘
Introducción
Para obtener un certificado SSL y asegurarnos HTTPS en nuestro sitio web, vamos a utilizar una Auditoria Certificadora llamada Let’s Encrypt. No vamos a entrar en detalles sobre que es Let’s Encrypt, pero básicamente nos da un certificado totalmente gratuito por 3 meses, con posibilidad de renovarlo (acá vamos a ver una forma de renovarlo automáticamente cada 3 meses 😉)
Requisitos
Para este tutorial necesitarás contar con lo siguiente:
- Contar con Ubuntu (versión 14.04 o superior) como sistema operativo.
- Tener ya instalado una versión de Laravel en Nginx.
- Tener instalador el firewall UFW.
Primer paso: Instalar Certbot
Certbot es un software que nos permitirá obtener un certificado SSL mediante Let’s Encrypt.
Primero, agregar el repositorio:
$ sudo add-apt-repository ppa:certbot/certbot
Luego, actualizamos la lista de paquetes para recolectar la información de los paquetes del nuevo repositorio:
$ sudo apt update
Y por ultimo, instalamos el paquete Nginx de Certbot:
$ sudo apt install python-certbot-nginx
Listo, ya tenemos Certbot para ser usado. Ahora vamos a habilitar el firewall para las peticiones HTTPS, ya que las mismas ingresan por el puerto 443 (http ingresa por el puerto 80 normalmente).
Segundo paso: Habilitar el firewall para permitir HTTPS
Vamos a configurar el firewall ufw para permitir el tráfico HTTPS. Primero vamos a habilitar el perfil completo de Nginx y borrar los perfiles redundantes, de esta forma:
$ sudo ufw allow 'Nginx Full'
$ sudo ufw delete allow 'Nginx HTTP'
Si ejecutamos el status de nginx, tendríamos que tener algo así:
$ sudo ufw status
A continuación, ejecutaremos Certbot para obtener nuestros certificados.
Tercer paso: Obtener certificado SSL
El comando para que Certbot nos de los certificados SSL es el siguiente:
$ sudo certbot --nginx -d tudominio.com -d www.tudominio.com
(Reemplaza «tudominio» por tu dominio, obvio no? 😂)
Esto ejecuta certbot
con para obtener los certificados validos para los dominios que especificaste.
Si ésta es la primera vez que se ejecuta certbot
, se te solicitará que ingreses una dirección de correo electrónico y que aceptes los términos de servicio. Al hacerlo, certbot
se comunicará con el servidor Let’s Encrypt, para intentar verificar que tú controlas el dominio para el cual se está solicitando el certificado.
En caso de éxito, certbot
te preguntará cómo configurar los ajustes para HTTPS:
En el mensaje anterior te permitirá escoger entre redireccionar o no el tráfico de HTTP a HTTPS. Te recomiendo redireccionar el trafico, por lo tanto ingresa el numero 2 y presiona ENTER
.
Luego de presionar ENTER
, la configuración será actualizada, y Nginx se recargará para activar los nuevos ajustes. Certbot concluirá con un mensaje informando que el proceso fue exitoso y la localización de tus certificados.
Tercer paso: Verificar configuración de Nginx
Por ultimo, tu archivo de configuración de nginx debería tener estos parámetros:
Si no es así, edita tu archivo hasta que sea similar a este y reinicia nginx para que tome la nueva configuración. Para verificar que la sintaxis de tu archivo de configuración es correcta, puede ejecutar el siguiente comando:
$ sudo nginx -t
Si todo esta correcto, reinicia nginx con el comando:
$ sudo systemctl reload nginx
Si todo esta bien, ya puedes recargar tu sitio web usando el prefijo https://
y observa el indicador de seguridad de tu navegador. Debería indicar que el sitio se encuentra asegurado de manera apropiada, usualmente se indica con el icono de un candado verde. Si pruebas tu sitio usando el test del servidor del laboratorio SSL, debería obtener el grado A.
Cuarto paso: Renovar automáticamente el certificado
El paquete certbot
que instalamos ya se ha ocupado de adicionar un archivo de comandos de renovación en /etc/cron.d
. Este archivo de comandos se ejecuta dos veces al día y renovará automáticamente los certificados que presenten una fecha de expiración dentro de los siguientes treinta días.
Para probar el proceso de renovación, puedes hacer una prueba con el comando:
$ sudo certbot renew --dry-run
Si no da errores, el proceso se encuentra funcionando. De ser necesario, Certbot renovará tus certificados y recargará Nginx para activar los cambios. Si el proceso automático de renovación alguna vez falla, Let’s Encrypt te enviará un mensaje al correo electrónico que especificaste, alertando que tu certificado se encuentra próximo a expirar.
¿Utilizas Apache en lugar de Nginx?
¡No hay problema! En este artículo de Laravel tip te comentamos como obtener un Certificado SSl Gratuito en Apache.
Conclusión
En este tutorial vimos como habilitar HTTPS en Nginx para nuestro proyecto de Laravel. Utilizamos Certbot para obtener un certificado de Let’s Encrypt que nos hace las cosas fácil y lo mejor de todo, gratis. En un próximo artículo vamos a hacer lo mismo pero con Apache. 😉🤙