Configurando Apache para que soporte SSL

- Andrés Cruz

In english

Configurando Apache para que soporte SSL

Cómo sabrás, HTTPS es la versión segura de HTTP y es empleada en todo tipo de aplicaciones web como Twitter, Gmail, diferentes sistemas bancarios, etc; permite agregar una capa de seguridad a las aplicaciones a través de un cifrado cuyo soporte es un certificado que permite “certificar” la identidad de ese ente (computador, empresa o persona).

Claves privadas y públicas en los certificados

key

Estos certificados contienen una clave pública y otra privada; la clave pública es la que generamos nosotros mediante el CSR y que es validada por otro servidor (esa sería la idea y que no nos autofirmemos la petición).

La clave privada es simplemente una contraseña de seguridad que generamos en posteriores pasos y se queda en el servidor y no debe ser compartida.

Para poder generar la clave privada y pública es necesitaremos algunas herramientas adicionales y así poder emplear el HTTPS en nuestra web que veremos a continuación.

Módulo mod_ssl de Apache

El mod_ssl no es más que un módulo para Apache que provee soporte para SSL y debemos instalar para poder emplear HTTPS en nuestra web.

En las máquinas que empleen los repositorios RPM como Fedora podemos instalar el módulo mod_ssl de Apache con el siguiente comando:

yum -y install mod_ssl

Generando el certificado SSL

Con nuestro módulo para el soporte SSL instalado, podemos comenzar a generar el certificado para nuestro sitio.

Abrimos la consola en linux y nos ubicamos en cualquier directorio (más adelante los ubicamos en la ruta especificada); con esto podemos ir al siguiente paso.

Generación de la clave privada

Primero debemos crear la clave privada que tendrá un longitud de 1024 caracteres (existen otros parámetros como -des3 para especificar un algoritmo de triple cifrado pero estos son opcionales):

openssl genrsa -out ca.key 1024

Generación de CSR

El CSR (certificate Signing Request) es un archivo que contiene información sobre la persona o empresa (localidad, dominio...); con este archivo podemos solicitar a otro ente certificado que lo firme y de esta forma que los datos que suministramos son correctos y de esta forma se arma una cadena de certificaciones y nuestro ente pasa a ser certificado.

openssl req -new -key ca.key -out ca.csr

Cuando ejecutes el comando anterior, verás que solicita una serie de información en donde la más importante es la referente al dominio; enta viene siendo nuestra clave pública y es la que debemos compartir con otro servidor (en circunstancias normales) para su validación.

Autofirmado el certificado

Aunque no sería lo ideal para alguna aplicación en producción, nos autofirmaremos el certificado y se establece el período de validez que podremos a 365 días:

openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt

Reubicar los archivos anteriores

Finalmente, debemos reubicar los archivos generados anteriormente a su ubicación final en nuestros directorios de Apache:

mv ca.crt /etc/pki/tls/certs
mv ca.key /etc/pki/tls/private/ca.key
mv ca.csr /etc/pki/tls/private/ca.csr

Activando el SSL en Apache

Ahora debemos ubicar el archivo ssl.conf que posiblemente esté ubicado en /etc/httpd/conf.d/ssl.conf y debemos buscar las siguientes líneas:

SSLCertificateFile /etc/pki/tls/certs/localhost.crt 
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key

Y cambiarlas por:

SSLCertificateFile /etc/pki/tls/certs/ca.crt 
SSLCertificateKeyFile /etc/pki/tls/private/ca.key

Verificamos que Apache escuche los puertos correspondientes (SSL trabaja con el puerto 443 y el puerto 80 es el empleado por defecto por Apache) en el archivo /etc/httpd/conf/httpd.conf deben estar presente y descomentadas las siguientes líneas:

Listen 80
Listen 443

Configurando el VirtualHost en Apache

Ahora ubicamos el archivo /etc/httpd/conf/httpd.conf: y agregamos/modificamos el VirtualHost del sitio:

<VirtualHost crm.net>
    DocumentRoot /var/www/html/crm
    ServerName crm.net
</VirtualHost>

Reiniciamos el servicio de apache:

sudo service httpd stop
sudo service httpd start

O:

service httpd restart

Y si todo nos ha ido bien; veremos un sitio como el siguiente:

APache sSL no seguro

Ese error es debido a que la firma es autogenerada y por lo tanto es considerado como un sitio poco confiable.

Posible error:

Si Apache no inicia, podemos verificar el log de apache, en mi caso verifiqué el log ubicado en:

gedit /var/log/httpd/ssl_error_log

Y al final del archivo había un error como el siguiente:

Permission denied: AH02574: Init: Can't open server private key file /etc/pki/tls/private/ca.key

Este error se debe a la forma en que fueron creados estos archivos (fuera del directorio de Apache); en Linux cada archivo tiene una serie de información que llaman contexto, según cómo esté estructurada esta información es posible que ciertos procesos no se ejecuten correctamente o simplemente denieguen la ejecución (como nos está pasando); debemos restaurar el contexto de los archivos para que puedan ejecutarse, para eso debemos emplear el siguiente comando para cada uno de los archivos copiados:

sudo restorecon -RvF /etc/pki/tls/private sudo restorecon -RvF /etc/pki/tls/certs

Debes de tener presente que el sistema también tenga los permisos necesarios para ejecutarse.

Enlaces de interés

Acepto recibir anuncios de interes sobre este Blog.

Se explicará los pasos a realizar para crear un certificado SSL (clave privada y pública) y acceder de manera segura mediante HTTPS con el módulo mod_ssl de Apache

- Andrés Cruz

In english