¿Cómo configurar SSL en Apache con alojamiento virtual?

Aprender Certificado Fundación Linux en España contenido Técnicos desde Cero en CiberED

En el Capítulo 18 configuramos Apache con Virtual Hosts basados en nombre para servir múltiples sitios HTTP en el puerto 80.

Aunque. hoy en día, es imprescindible proteger las comunicaciones mediante SSL/TLS (HTTPS en el puerto 443). El protocolo TLS (sucesor de SSL) cifra el tráfico y autentica el servidor mediante certificados digitales.

Un desafío histórico fue cómo servir varios sitios HTTPS con diferentes certificados en una misma IP y puerto.

23.1. Introducción a SSL/TLS y SNI

Antes era necesario dedicar una IP por cada certificado. La solución moderna es SNI (Server Name Indication), una extensión del protocolo TLS que permite al cliente indicar el nombre del servidor al inicio de la negociación TLS. De esta forma, Apache puede seleccionar el certificado correcto para cada Virtual Host basado en el nombre solicitado.

Hoy todos los navegadores y servidores modernos soportan SNI, por lo que es la práctica estándar para alojar múltiples sitios SSL en un mismo servidor.

En este capítulo aprenderás a:

  • Instalar y activar el módulo SSL de Apache.
  • Generar o instalar certificados SSL/TLS.
  • Configurar Virtual Hosts SSL basados en nombre (SNI).
  • Redirigir automáticamente HTTP a HTTPS.
  • Verificar y solucionar problemas de configuración.

23.2. Instalación del módulo SSL en Apache

23.2.1. Debian/Ubuntu

Si Apache ya está instalado, asegúrate de tener el módulo SSL:

sudo apt install apache2
sudo a2enmod ssl
sudo systemctl restart apache2

23.2.2. RHEL/CentOS/Fedora

Instalar el paquete mod_ssl:

sudo yum install httpd mod_ssl   # o dnf
sudo systemctl restart httpd

Verificar que el módulo está cargado:

  • Debian: apache2ctl -M | grep ssl
  • RHEL: httpd -M | grep ssl

23.3. Certificados SSL/TLS

Un certificado digital contiene la clave pública del servidor, información del propietario y está firmado por una Autoridad de Certificación (CA). Para producción se usan certificados emitidos por CA comerciales o por Let’s Encrypt. Para entornos de prueba y laboratorio, los certificados autofirmados son suficientes.

23.3.1. Generar un certificado autofirmado

Crear un directorio para los certificados:

sudo mkdir -p /etc/apache2/ssl   # Debian
sudo mkdir -p /etc/httpd/ssl     # RHEL

Generar el certificado y la clave privada:

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

Se pedirá información (país, estado, ciudad, organización, common name). El Common Name (CN) debe coincidir con el nombre de dominio del sitio (ej. www.mi-sitio.com). Para múltiples nombres, hoy se usan certificados con SAN (Subject Alternative Name), pero un autofirmado simple con CN es aceptable para laboratorio.

23.3.2. Certificados con Let’s Encrypt (certbot)

Para producción, Let’s Encrypt ofrece certificados gratuitos. Instalación en Debian:

sudo apt install certbot python3-certbot-apache
sudo certbot --apache -d ejemplo.com -d www.ejemplo.com

Certbot configura automáticamente Apache y renueva los certificados.

23.4. Configuración de Virtual Hosts SSL con SNI

23.4.1. Estructura de un Virtual Host SSL

Un Virtual Host SSL en Apache 2.4 tiene esta forma básica:

<VirtualHost *:443>
    ServerName www.ejemplo.com
    DocumentRoot /var/www/ejemplo

    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/mi-sitio.crt
    SSLCertificateKeyFile /etc/apache2/ssl/mi-sitio.key

    <Directory /var/www/ejemplo>
        Require all granted
    </Directory>
</VirtualHost>
  • SSLEngine on: activa TLS para este Virtual Host.
  • SSLCertificateFile: ruta al certificado (crt/pem).
  • SSLCertificateKeyFile: ruta a la clave privada.
  • Para certificados encadenados (CA intermedia), se usa SSLCertificateChainFile (obsoleto en Apache 2.4.8+; se incluye en el archivo de certificado).

23.4.2. Configurar múltiples Virtual Hosts SSL con SNI

Gracias a SNI, cada Virtual Host SSL puede tener su propio certificado. Ejemplo con dos sitios:

Sitio 1: www.ejemplo1.com

Archivo /etc/apache2/sites-available/ejemplo1-ssl.conf (Debian) o /etc/httpd/conf.d/ejemplo1-ssl.conf (RHEL):

<VirtualHost *:443>
    ServerName www.ejemplo1.com
    DocumentRoot /var/www/ejemplo1

    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/ejemplo1.crt
    SSLCertificateKeyFile /etc/apache2/ssl/ejemplo1.key
</VirtualHost>

Sitio 2: www.ejemplo2.com

<VirtualHost *:443>
    ServerName www.ejemplo2.com
    DocumentRoot /var/www/ejemplo2

    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/ejemplo2.crt
    SSLCertificateKeyFile /etc/apache2/ssl/ejemplo2.key
</VirtualHost>

Apache seleccionará el certificado correcto según el nombre indicado por el cliente (SNI). Si un cliente no soporta SNI (muy raro hoy), se usará el primer Virtual Host SSL definido.

23.4.3. Activar los sitios (Debian)

En Debian, usar a2ensite:

sudo a2ensite ejemplo1-ssl.conf
sudo a2ensite ejemplo2-ssl.conf
sudo systemctl reload apache2

En RHEL, los archivos en /etc/httpd/conf.d/ se cargan automáticamente al reiniciar.

23.5. Redirección de HTTP a HTTPS

Es una buena práctica forzar a los usuarios a usar HTTPS. Se puede hacer de varias formas:

23.5.1. Con Redirect permanente en el Virtual Host HTTP

En el Virtual Host del puerto 80:

<VirtualHost *:80>
    ServerName www.ejemplo.com
    Redirect permanent / https://www.ejemplo.com/
</VirtualHost>

Esto devuelve un código 301 (Moved Permanently).

23.5.2. Con mod_rewrite

Activar mod_rewrite:

  • Debian: sudo a2enmod rewrite
  • RHEL: ya suele estar activo.

En el Virtual Host HTTP:

<VirtualHost *:80>
    ServerName www.ejemplo.com
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R=301,L]
</VirtualHost>

23.6. Configuración adicional recomendada

23.6.1. Protocolos y cifrados fuertes

Para mejorar la seguridad, se pueden especificar protocolos TLS modernos y cifrados seguros:

SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite HIGH:!aNULL:!MD5:!3DES
SSLHonorCipherOrder on

23.6.2. HSTS (HTTP Strict Transport Security)

Indica al navegador que solo use HTTPS en el futuro:

Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"

Requiere mod_headers activo.

23.7. Verificación y prueba

23.7.1. Verificar la sintaxis de Apache

  • Debian: sudo apache2ctl configtest
  • RHEL: sudo httpd -t

23.7.2. Probar con openssl s_client

openssl s_client -connect www.ejemplo.com:443 -servername www.ejemplo.com

Observa que el certificado presentado corresponde al nombre. Para probar SNI explícitamente, usa -servername distinto en cada prueba.

23.7.3. Probar con curl

curl -I https://www.ejemplo.com
curl -k https://192.168.1.10/  # si usas IP y certificado no coincide

23.7.4. Revisar logs

  • /var/log/apache2/error.log (Debian)
  • /var/log/httpd/error_log (RHEL)

23.8. Solución de problemas comunes

ProblemaPosible causaSolución
“SSL handshake failed”Cliente no soporta protocolos modernos, certificado incorrectoRevisar protocolos, regenerar certificado
“Certificate mismatch”El nombre del certificado no coincide con el solicitadoUsar SNI correctamente o certificado SAN
Apache no arranca tras configurar SSLError en rutas de certificado o clave, permisos incorrectosVerificar existencia y permisos (600 en clave), probar configtest
“Unable to configure server certificate”Archivo de certificado vacío o formato incorrectoRevisar contenido con openssl x509 -in archivo.crt -text
HTTPS no responde pero HTTP síFirewall bloquea puerto 443 o módulo SSL no cargadoAbrir puerto 443, verificar a2enmod ssl o mod_ssl

23.9. Ejercicios prácticos

  1. Certificado autofirmado y Virtual Host SSL único:

    • Genera un certificado autofirmado para sitio1.test.
    • Configura un Virtual Host en el puerto 443 con DocumentRoot /var/www/sitio1.
    • Prueba con openssl s_client -connect localhost:443 -servername sitio1.test. Debe mostrar el certificado.
  2. Múltiples sitios SSL con SNI:

    • Crea certificados para sitio1.test y sitio2.test.
    • Configura dos Virtual Hosts SSL en el puerto 443, cada uno con su propio DocumentRoot y certificado.
    • Prueba con openssl s_client -servername sitio1.test y -servername sitio2.test. Verifica que devuelve certificados diferentes.
  3. Redirección HTTP→HTTPS:

    • Configura Virtual Host en puerto 80 para sitio1.test que redirija permanentemente a HTTPS.
    • Prueba con curl -I http://sitio1.test y observa el código 301 y la cabecera Location:.
  4. HSTS y seguridad:

    • Añade la cabecera HSTS y restricciones de protocolos/cifrados. Verifica con curl -I https://sitio1.test que aparece Strict-Transport-Security.
  5. Configuración en RHEL/CentOS:

    • Repite los pasos en una máquina con RHEL/CentOS si dispones de ella, adaptando rutas y comandos.

23.10. Resumen y consejos para LFCS

  • SNI permite servir múltiples certificados SSL en una misma IP y puerto.
  • El módulo SSL debe estar habilitado: a2enmod ssl (Debian) o paquete mod_ssl (RHEL).
  • Las directivas clave son SSLEngine on, SSLCertificateFile y SSLCertificateKeyFile.
  • La redirección HTTP→HTTPS se hace con Redirect permanent o mod_rewrite.
  • Verifica siempre con configtest y openssl s_client.
  • En el examen, es probable que te pidan configurar un Virtual Host SSL con un certificado autofirmado y redirigir HTTP a HTTPS. Practica el flujo completo en un laboratorio.

Con esto has dominado la configuración de SSL en Apache con SNI, una habilidad esencial en la administración web moderna. En el próximo capítulo configuraremos un cortafuegos con Iptables, base de la seguridad perimetral en Linux.

Vistas: 0

Descubre más desde CIBERED

Suscríbete y recibe las últimas entradas en tu correo electrónico.

Scroll al inicio