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
| Problema | Posible causa | Solución |
|---|---|---|
| “SSL handshake failed” | Cliente no soporta protocolos modernos, certificado incorrecto | Revisar protocolos, regenerar certificado |
| “Certificate mismatch” | El nombre del certificado no coincide con el solicitado | Usar SNI correctamente o certificado SAN |
| Apache no arranca tras configurar SSL | Error en rutas de certificado o clave, permisos incorrectos | Verificar existencia y permisos (600 en clave), probar configtest |
| “Unable to configure server certificate” | Archivo de certificado vacío o formato incorrecto | Revisar contenido con openssl x509 -in archivo.crt -text |
| HTTPS no responde pero HTTP sí | Firewall bloquea puerto 443 o módulo SSL no cargado | Abrir puerto 443, verificar a2enmod ssl o mod_ssl |
23.9. Ejercicios prácticos
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.
- Genera un certificado autofirmado para
Múltiples sitios SSL con SNI:
- Crea certificados para
sitio1.testysitio2.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.testy-servername sitio2.test. Verifica que devuelve certificados diferentes.
- Crea certificados para
Redirección HTTP→HTTPS:
- Configura Virtual Host en puerto 80 para
sitio1.testque redirija permanentemente a HTTPS. - Prueba con
curl -I http://sitio1.testy observa el código 301 y la cabeceraLocation:.
- Configura Virtual Host en puerto 80 para
HSTS y seguridad:
- Añade la cabecera HSTS y restricciones de protocolos/cifrados. Verifica con
curl -I https://sitio1.testque apareceStrict-Transport-Security.
- Añade la cabecera HSTS y restricciones de protocolos/cifrados. Verifica con
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 paquetemod_ssl(RHEL). - Las directivas clave son
SSLEngine on,SSLCertificateFileySSLCertificateKeyFile. - La redirección HTTP→HTTPS se hace con
Redirect permanentomod_rewrite. - Verifica siempre con
configtestyopenssl 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.
Descubre más desde CIBERED
Suscríbete y recibe las últimas entradas en tu correo electrónico.
