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
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:
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
- Configurar soporte HTTPS en Apache
- Configuración de Apache con soporte SSL/TLS
- Certificados con OpenSSL
- Documentación fedora
Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter