Certificados TLS
El primer paso para ejecutar esta guía es obtener los certificados TLS.
Recuerde que el tamaño de las claves es un aspecto importante de la seguridad, actualmente está generalizado el tamaño de 2048 bis, pero la recomendación es usar 4096 bits para una mayor robustez.
Plantilla de configuración segura
/etc/apache2/conf-available/ssl-params.conf
SSLCipherSuite TLSv1.3 TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256 SSLCipherSuite SSL ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256 # Requires Apache 2.4.36 & OpenSSL 1.1.1 SSLProtocol -all +TLSv1.3 +TLSv1.2 SSLOpenSSLConfCmd Curves X25519:secp521r1:secp384r1:prime256v1 # Older versions # SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 SSLHonorCipherOrder On Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" Header always set X-Frame-Options DENY Header always set X-Content-Type-Options nosniff # Requires Apache >= 2.4 SSLCompression off SSLUseStapling on SSLStaplingCache "shmcb:logs/stapling-cache(150000)" # Requires Apache >= 2.4.11 SSLSessionTickets Off |
Explicación
Crear el fichero de configuración para el host
Crearemos un fichero en la ruta /etc/apache2/conf-available/<nombre_fichero>
Como <nombre_fichero> podemos poner algo representativo como " ssl-params.conf ", en el cual añadiremos la plantilla diseñada arriba.
Habilitar los módulos y encabezados SSL de Apache
Instalación de mod_ssl
$ sudo a2enmod ssl $ sudo a2enmod headers |
Directivas básicas
Se debe indicar el puerto de escucha, nombre del servidor, las rutas de acceso a la clave privada, certificado del servidor y de la CA:
/etc/apache2/sites-available/default-ssl.conf
Listen 443 <VirtualHost *:443> ServerName www.example.com or IP SSLEngine on SSLCertificateFile "/path/to/www.example.com.cert" SSLCertificateKeyFile "/path/to/www.example.com.key" SSLCACertificateFile "/etc/pki/tls/certs/ca.crt" </VirtualHost> |
Configuración de privilegios
Es necesario restringir el acceso a la carpetas donde se encuentra la clave privada:
Privilegios
chown root:root /etc/pki/tls/private/example.com.key chmod 600 /etc/pki/tls/private/example.com.key |
Abrir puerto del firewall local
Apertura del puerto 443 del firewall:
Apertura de puertos
firewall-cmd --permanent --add-port=443 firewall-cmd --reload |
Configuración para cifrado fuerte
Con esta configuración:
Evitamos el uso de versiones anticuadas de SSL y TLS (Se recomienda usar siempre TLSv1.2 ó v1.3)
La habilitación
SSLHonorCipherOrder
asegura que se sigan las preferencias de cifrado del servidor en lugar de las del cliente.La desactivación
SSLCompression
evita los ataques de Oracle de compresión TLS (por ejemplo, CRIME ).La desactivación
SSLSessionTickets
garantiza que Perfect Forward Secrecy no se vea comprometido si el servidor no se reinicia con regularidad.
Configuración cifrado fuerte
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256 SSLHonorCipherOrder on SSLCompression off SSLSessionTickets off |
Habilitar OCSP
Para habilitar una conexión segura cliente-servidor, el cliente tiene que verificar que el certificado es de confianza y no ha caducado, por que tiene que consultar al emisor del certificado. Esto provoca un tiempo de carga mayor para la página que repercute en el usuario final. Para resolver este problema podemos configurar Apache para que obtenga un mensaje firmado del servidor OCSP y al inicializar una conexión con algún cliente, unirlo al handshake inicial. De esta manera el cliente puede estar seguro de que el certificado no está caducado, evitando preguntar explícitamente al servidor OCSP.
Directivas para OCSP
SSLUseStapling On SSLStaplingCache "shmcb:ssl_stapling(32768)" |