Agregar un certificado autofirmado para Apache en CentOS

En una entrada anterior instalamos y configuramos un servidor Apache en CentOS.

TLS o «Seguridad de la Capa de Transporte» y su predecesor SSL, son protocolos que se utilizan para envolver el tráfico normal y convertirlo en tráfico cifrado y protegido.

Con esta tecnología, los servidores pueden enviar información segura a sus clientes sin que sus mensajes sean interceptados o leídos por terceros.

En esta entrada, crearemos un certificado autofirmado para Apache, esto nos permitirá configurar nuestro servidor para funcionar por HTTPS y tener conexiones seguras.

Paso 1.- Instalar mod_ssl

Primero necesitamos instalar mod_ssl, que es un módulo de Apache que provee soporte para encriptaciones SSL.

$ sudo dnf install mod_ssl

Debido a un error de empaquetado, debemos reiniciar Apache una vez para generar correctamente el certificado y la clave SSL predeterminados, de lo contrario obtendremos un error al leer.

$ sudo systemctl restart httpd

Paso 2.- Crear el certificado SSL

Ahora que Apache está listo para usar cifrado, podemos generar un nuevo certificado.

El certificado almacenará información básica de tu sitio u organización, y estará acompañada de una clave que permitirá al servidor manejar los datos encriptados de manera segura.

$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/pki/tls/private/apache-selfsigned.key -out /etc/pki/tls/certs/apache-selfsigned.crt

Durante la creación del certificado, se te solicitará información básica de tu sitio.

  • Country name (2 digitos).- País
  • State or Province Name.- Estado o provincia
  • Locality Name.- Nombre de la localidad
  • Organization Name.- Nombre de la organización
  • Organizational Unit Name.- Nombre del departamento de la organización
  • Common Name.- Nombre de dominio o dirección IP. Es importante que este campo coincida con lo que ingrese en la barra de direcciones del navegador para acceder al sitio, si existe una discrepancia, se generarán errores de seguridad.
  • Email Address.- Dirección de correo electrónico.

La explicación al comando anterior es la siguiente:

  • openssl: Esta es la herramienta para la creación y manejo de certificados, claves y otros archivos OpenSSL
  • req -x509: Especifica que usaremos X.509, que es un estándar de infraestructura de clave pública al que se adhieren SSL y TLS para la gestión de claves y certificados.
  • -nodes: Le dice a OpenSSL que omita la opción de asegurar nuestro certificado con una frase de contraseña. Necesitamos que Apache pueda leer el archivo sin la intervención del usuario cuando se inicia el servidor.
  • -days 365: Esta opción establece el periodo de tiempo (en días) que el certificado se considera válido. Muchos navegadores modernos rechazarán cualquier certificado que sea válido por mas de un año.
  • -newkey rsa:2048: Especifica que queremos generar un nuevo certificado y una nueva clave al mismo tiempo. RSA:2048 le indica que cree una clave RSA de 2048 bits de longitud.
  • -keyout: Esta línea le dice a OpenSSL donde guardar el archivo de clave privada generada que estamos creando.
  • -out: Esto le dice a OpenSSL donde guardar el certificado que creamos.

Paso 3.- Configurando Apache para usar SSL

Ahora que tenemos nuestro certificado autofirmado y nuestra clave disponible, necesitamos actualizar nuestra configuración de Apache.

En CentOS, puede colocar nuevos archivos de configuración de Apache (deben terminar en .conf) en /etc/httpd/conf.d/ y se cargarán la próxima vez que se reinicie el servicio de Apache.

Para este tutorial crearemos un nuevo archivo de configuración mínima. Si ya tienes configurado un servidor virtual (VirtualHost) y solo necesita agregarle SSL, es probable que deba copiar las líneas de configuración que comienzan con SSL y cambiar el puerto VirtualHost de 80 a 443.

Abre un nuevo archivo en el directorio /etc/httpd/conf.d/

$ sudo nano /etc/httpd/conf.d/your_domain_or_ip.conf

Pega la siguiente configuración mínima de virtual host

<VirtualHost *:443>     
  ServerName your_domain_or_ip     
  DocumentRoot /var/www/ssl-test     
  SSLEngine on     
  SSLCertificateFile /etc/pki/tls/certs/apache-selfsigned.crt     
  SSLCertificateKeyFile /etc/pki/tls/private/apache-selfsigned.key 
</VirtualHost>

Asegurate de actualizar la linea ServerName con la dirección de tu servidor. Puede ser un nombre de host, dominio completo o dirección IP. Asegurate que coincida con el nombre común que elegiste al crear el certificado.

Las líneas restantes especifican un directorio DocumentRoot para servir archivos y las opciones de SSL necesarias para apuntar a Apache a nuestro certificado y clave recién creados.

Ahora crearemos un directorio y pongamos un archivo HTML en él solo con fines de prueba:

$ sudo mkdir /var/www/ssl-test

Abre un nuevo archivo index.html en el directorio recién creado

$ sudo nano /var/www/ssl-test/index.html

Pega lo siguiente en el archivo

<h1>it worked!</h1>

Este archivo será suficiente para verificar nuestra configuración. Guarda y cierra el archivo, luego verifica la configuración de Apache para ver si hay errores de sintaxis con lo siguiente:

$ sudo apachectl configtest

Es posible que veas algunas advertencias, pero siempre que el resultado finalice con la expresión Sintax OK, puede continuar. Si esto no es parte de su salida, verifique la sintaxis de sus archivos de sus archivos e intente nuevamente.

Cuando todo esté bien, vuelve a cargar Apache para recargar los cambios realizados.

$ sudo systemctl reload httpd

Ahora carga tu sitio en un navegador, asegurandote de usar https:// al inicio

Deberías ver un error. Esto es normal debido a que tienes un certificado autofirmado. El navegador te advierte que no se puede verificar la identidad del servidor porque nuestro certificado no está firmado por ninguna de las autoridades de certificación conocidas del navegador. Para propósitos de prueba y uso personal esto es bueno.

Después de aceptar el mensaje, tu navegador cargará el mensaje escrito en el archivo index.html

NOTA: Si tu navegador no conecta con el servidor, asegúrate de que tus conexiones no están siendo bloqueadas por el firewall. 
$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https
$ sudo firewall-cmd --reload

A continuación, agregaremos otra sección VirtualHost a nuestra configuración para atender solicitudes HTTP simples y redirigirlas a HTTPS.

Paso 4.- Redirigiendo HTTP a HTTPS

Actualmente, nuestra configuración solo responderá a las solicitudes HTTPS en el puerto 443. Es una buena práctica responder también en el puerto 80, incluso si deseas forzar el cifrado de todo el tráfico.

Configuremos un VirtualHost para responder a estas solicitudes no cifradas y redirigirlas a HTTPS.

Abre el archivo de configuración de Apache que hemos creado antes.

$ sudo nano /etc/httpd/conf.d/your_domain_or_ip.conf

Debajo de lo que escribimos anteriormente crea otro bloque VirtualHost para que coincida con las solicitudes en el puerto 80.

Utiliza la directiva ServerName para volver a hacer coincidir su nombre de dominio o dirección IP. Luego, use Redirect para hacer coincidir las solicitudes y enviarlas al SSL VirtualHost. Asegurate de incluir la barra inclinada final:

<VirtualHost *:80>     
  ServerName your_domain_or_ip     
  Redirect / https://your_domain_or_ip/ 
</VirtualHost>

Tu archivo final debería tener el siguiente aspecto

<VirtualHost *:443>     
  ServerName your_domain_or_ip     
  DocumentRoot /var/www/ssl-test     
  SSLEngine on     
  SSLCertificateFile /etc/pki/tls/certs/apache-selfsigned.crt     
  SSLCertificateKeyFile /etc/pki/tls/private/apache-selfsigned.key 
</VirtualHost>

<VirtualHost *:80>     
  ServerName your_domain_or_ip     
  Redirect / https://your_domain_or_ip/ 
</VirtualHost>

Guarda y cierra este archivo. Después de que hayas finalizado, prueba la sintaxis de configuración y vuelve a cargar Apache.

$ sudo apachectl configtest

$ sudo systemctl reload httpd

Puedes probar la funcionalidad de redireccionamiento visitando tu sitio con http:// ; esto debería redirigirte a https:// automáticamente.

Consideraciones

Para algunas configuraciones de servidor que atiendan peticiones PHP y deban conectarse a un servidor de base de datos, será necesario instalar los paquetes php-pdo y php-mysqli:

$ sudo yum install php-pdo php-mysqli

Referencias externas

Deja un comentario