Activar HTTPS en Apache2 (Ubuntu Server) con certificado autofirmado

1) Activar SSL/TLS en Apache

Apache en Ubuntu usa módulos. Para HTTPS necesitas ssl.

sudo a2enmod ssl
sudo systemctl restart apache2

Comprueba que el módulo está activo:

apache2ctl -M | grep ssl

2) Crear un certificado autofirmado (OpenSSL)

Vamos a crear:

  • clave privada (key)
  • certificado (crt)

2.1 Crear carpeta para certificados (ordenadito)

sudo mkdir -p /etc/apache2/ssl
sudo chmod 700 /etc/apache2/ssl

2.2 Generar clave + certificado (válido 365 días)

Cambia TU_SERVIDOR por un nombre identificable (ej: asir-01, web-lab, o el FQDN si tenéis DNS).

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/apache2/ssl/TU_SERVIDOR.key \
-out /etc/apache2/ssl/TU_SERVIDOR.crt

Cuando pregunte por campos, lo importante es:

  • Common Name (CN): poned el nombre o la IP con la que vais a acceder.
    • Si accederéis por IP: poned la IP (ej 192.168.1.50)
    • Si accederéis por nombre: poned ese nombre (ej asir-01.local)

Verifica que existen:

sudo ls -l /etc/apache2/ssl/

3) Crear un VirtualHost HTTPS (443)

Apache en Ubuntu suele tener el sitio por defecto en /etc/apache2/sites-available/000-default.conf.

Vamos a crear uno nuevo: https-lab.conf.

3.1 Crear el archivo del sitio HTTPS

sudo nano /etc/apache2/sites-available/https-lab.conf

Pega esto (cambia TU_SERVIDOR y, si quieres, el ServerName):

<VirtualHost *:443>
    ServerName TU_SERVIDOR
    DocumentRoot /var/www/html

    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/TU_SERVIDOR.crt
    SSLCertificateKeyFile /etc/apache2/ssl/TU_SERVIDOR.key

    ErrorLog ${APACHE_LOG_DIR}/https_error.log
    CustomLog ${APACHE_LOG_DIR}/https_access.log combined
</VirtualHost>

Guarda y sal.

3.2 Habilitar el sitio y comprobar sintaxis

sudo a2ensite https-lab.conf
sudo apache2ctl configtest

Si sale Syntax OK, reinicia:

sudo systemctl reload apache2

4) Comprobar que HTTPS funciona

4.1 Ver que Apache escucha en 443

sudo ss -lntp | grep ':443'

4.2 Probar con curl (ignorando el aviso del certificado)

Sustituye por la IP o nombre real:

curl -kI https://192.168.1.50/

Deberías ver algo como:

  • HTTP/1.1 200 OK (o 301/302 si rediriges)
  • cabeceras de Apache

4.3 Probar desde navegador

Entrad a:

  • https://IP_DEL_SERVIDOR/

Saldrá aviso de seguridad (normal con autofirmados). La idea pedagógica: el cifrado funciona, pero el navegador no “confía” en la identidad.


5) (Opcional) Redirigir HTTP (80) a HTTPS (443)

Esto hace que todo lo que llegue por http:// vaya a https://.

5.1 Activar módulo rewrite

sudo a2enmod rewrite
sudo systemctl reload apache2

5.2 Editar el VirtualHost de puerto 80

Edita el sitio por defecto (o el que uséis en 80):

sudo nano /etc/apache2/sites-available/000-default.conf

Dentro del <VirtualHost *:80>, añade esto antes del cierre </VirtualHost>:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Comprueba y recarga:

sudo apache2ctl configtest
sudo systemctl reload apache2

Prueba:

curl -I http://192.168.1.50/

Debería devolver 301 Moved Permanently apuntando a https://....


6) (Opcional) Endurecer un poco HTTPS (sin volverse loco)

6.1 Activar HTTP/2 (si está disponible)

sudo a2enmod http2
sudo systemctl reload apache2

En tu https-lab.conf, dentro del VirtualHost 443, añade:

Protocols h2 http/1.1

6.2 Cabeceras básicas (seguridad “visible”)

Activa headers:

sudo a2enmod headers
sudo systemctl reload apache2

Dentro del <VirtualHost *:443> añade:

Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Referrer-Policy "strict-origin-when-cross-origin"

HSTS (solo si vais a usar HTTPS siempre; en lab puede dar guerra si cambiáis):

Header always set Strict-Transport-Security "max-age=86400"

7) Logs y troubleshooting (lo que siempre salva vidas)

7.1 Ver errores de Apache en directo

sudo tail -f /var/log/apache2/error.log

7.2 Ver logs del sitio HTTPS

sudo tail -f /var/log/apache2/https_error.log
sudo tail -f /var/log/apache2/https_access.log

7.3 Problemas típicos

  • No abre el 443: firewall/UFW o router/VLAN.
  • Apache no escucha en 443: revisa que ssl esté activo y que el sitio https-lab.conf esté habilitado. sudo a2query -m ssl
    sudo a2query -s https-lab
    sudo apache2ctl -S
  • Certificado no coincide (CN mal): recrea el cert con CN correcto.
  • Permisos: que Apache pueda leer el .crt y .key (en /etc/apache2/ssl suele ir bien con root y lectura adecuada; si te pasas bloqueando, falla).