Configurando Apache para que soporte SSL

21-04-2016 - Andrés Cruz

Configurando Apache para que soporte SSL
In english

Este material forma parte de mi curso y libro completo; puedes adquirirlos desde el apartado de libros y/o cursos.

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

Andrés Cruz

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz en Udemy

Acepto recibir anuncios de interes sobre este Blog.

!Cursos a!

10$

En Udemy

Quedan días!

Ver los cursos
¡Hazte afiliado en Gumroad!

!Cursos desde!

4$

En Academia

Ver los cursos

!Libros desde!

1$

Ver los libros
!Web Alojada en Hostinger!