Skip to content

🔐 Configurar HTTPS y redirección HTTP ➝ HTTPS con NGINX en un entorno real

Este documento detalla cómo proteger tu aplicación Laravel desplegada en un servidor real con HTTPS, utilizando NGINX y certificados SSL autosignados. También se configura la redirección automática desde HTTP a HTTPS para mejorar la seguridad.


1️⃣ Generar los certificados SSL en la máquina remota

Accede a tu servidor remoto y crea los certificados:

cd /etc/ssl
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout private.key -out public.crt

Este comando generará:

  • /etc/ssl/private.key → Clave privada
  • /etc/ssl/public.crt → Certificado público autosignado

🔐 Estos certificados son válidos para pruebas o entornos internos. Para producción real, usa Let's Encrypt (Certbot).


2️⃣ Modificar la configuración de NGINX (laravel.conf)

Edita el archivo de configuración del sitio Laravel en /etc/nginx/sites-available/laravel.conf.

🔁 Añadir un bloque server para redirigir HTTP ➝ HTTPS

Este bloque intercepta cualquier conexión por el puerto 80 y la redirige al puerto seguro 443:

server {
    listen 80;
    server_name localhost;
    return 301 https://$host$request_uri;
}

🔒 Configurar el bloque server existente para escuchar en HTTPS (puerto 443)

Modifica el bloque principal para que escuche en el puerto 443 con SSL:

server {
    listen 443 ssl;
    server_name localhost;

    ssl_certificate /etc/ssl/public.crt;
    ssl_certificate_key /etc/ssl/private.key;

    root /var/www/html/laravel-proyecto/public;
    index index.php index.html;

    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;

    error_page 404 /errors/404.html;
    location = /errors/404.html {
        root /var/www/html;
        internal;
    }

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location ~ /\.ht {
        deny all;
    }
}

📌 Notas:

  • ssl_certificate: ruta al certificado público.
  • ssl_certificate_key: ruta a la clave privada.
  • Se mantiene toda la lógica de Laravel y la protección de archivos .ht*.

3️⃣ Validar y reiniciar NGINX

✅ Validar sintaxis de la configuración:

nginx -t

🔄 Reiniciar NGINX para aplicar los cambios:

nginx -s reload

🔍 Comprobación

  1. Accede a http://IP-del-servidor → Debería redirigirte automáticamente a https://IP-del-servidor
  2. Acepta el certificado (si es autosignado).
  3. Laravel debería mostrarse correctamente con una conexión cifrada (candado).

🛡️ Recomendaciones de seguridad adicionales

  • Utiliza certificados válidos con Let's Encrypt.
  • Configura ssl_protocols y ssl_ciphers para mayor seguridad.
  • Usa redireccionamiento Strict-Transport-Security para forzar HTTPS:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;