Configuración de SSL en el servidor Apache

Cuando navegamos en internet es muy recomendable que los datos que enviamos y recibamos estén cifrados para evitar que pueden ser leídos por terceros en el proceso de la comunicación. El servidor Apache implementa el protocolo HTTPS que permite el cifrado de los datos aumentado la seguridad en las comunicaciones por internet.

La implementación de este protocolo en los servidores requiere de una tercera parte, la entidad certificadora, que validará la autenticidad del certificado del servidor.

La configuración de HTTPS en Apache se puede dividir en los siguientes apartados:

  • Instalación del módulo SSL
  • Generar una clave privada
  • Generar un CSR
  • Configuración del Site con el certificado firmado

Instalación del módulo SSL

Primero instalaremos el módulo para el servidor Apache (httpd), al instalar el paquete mod_ssl se añade automáticamente un fichero de configuración, llamado /etc/httpd/conf.d/ssl.conf, que contendrá la directiva para escuchar el puerto 443 (Listen 443), la carga el módulo específico (LoadModule ssl_module modules/mod_ssl.so) y un ejemplo de configuración de un host. La instalación se realizará de la siguiente forma:

# dnf install mod_ssl

# systemctl restart httpd

Y posteriormente la herramienta openSSL que nos permitirá crear un certificado que luego tendrá que ser firmado por una entidad certificadora de confianza.

# dnf install openssl

Es conveniente comprobar que tanto SELinux como el firewall permiten las conexiones por el puerto 443.

Para comprobarlo en SELinux ejecutaremos:

# semange port –l | grep http

Y para el firewall:

# firewall-cmd –list-all | grep services

Generación de una clave privada

Parar generar la clave de clifrado utilizaremos el programa OpenSSL:

# openssl genrsa -des3 -out server.key 2048

El comando anterior creará una clave con el password (pass-phrase) que le indiquemos, cada vez que sea utilizada tendremos que introducir la contraseña.

Si queremos evitar que nos pregunte la contraseña cada vez que se use la clave, por ejemplo en el reinicio del servidor Apache podremos eliminarla con el siguiente comando:

# openssl rsa -in server.key -out stripped.key

Normalmente las claves se guardan en un directorio bajo /etc, en el caso de Centos su ubicación sería /etc/pki/tls/private (aunque no es imprescindible y se puede guardar en cualquier directorio seguro)

Creación de CSR (Certificate Signing Request)

En la creación de petición de firma creamos un fichero “.csr” con la llave privada anteriormente creada para enviarlo a una entidad certificadora para que lo firme, en el proceso de creación deberemos dar toda la información que posteriormente vendrá reflejada en el certificado:

# openssl req -new -key server.key -out newreq.pem

Configuración del site con el certificado firmado

La entidad certificadora nos remitirá el certificado firmado, por ejemplo newcert.pem , ahora sólo quedará indicar a la configuración del Site (VirtualHost) el certificado y la llave de la siguiente forma:

SSLEngine On

SSLCertificateFile /etc/pki/certs/newcert.pem

SSLCertificateKeyFile /etc/pki/private/stripped.key

El fichero remitido por la CA puede tener varias extensiones como .crt o cer, pero el contenido es el mismo.

En función del tipo de certificado SSL que adquiera, es posible que la entidad emisora de certificados (CA) le proporcione un certificado SSL personalizado y un certificado intermedio. Esto indica que una entidad emisora intermedia ha firmado el certificado SSL.

Un certificado intermedio puede proporcionar un nivel adicional de seguridad, ya que representa el certificado raíz sin necesidad de mostrarlo directamente. Los certificados raíz e intermedios proporcionan una cadena de certificados que representa el certificado SSL personalizado emitido para usted.

Debe instalar el certificado intermedio con el certificado SSL emitido para completar la cadena de confianza para el certificado SSL personalizado, para ello añadiremos la opción SSLCACertificateFile.

Un ejemplo de VirtualHost sería el siguiente:

<VirtualHost *:443>

        SSLEngine on

        SSLCertificateFile /etc/pki/tls/certs/ca.crt

        SSLCertificateKeyFile /etc/pki/tls/private/ca.key

        SSLCACertificateFile /etc/pki/tls/certs/cacert.crt

        <Directory /var/www/vhosts/yoursite.com/httpsdocs>

        AllowOverride All

        </Directory>

        DocumentRoot /var/www/vhosts/yoursite.com/httpsdocs

        ServerName yoursite.com

</VirtualHost>