Soporte SSL en APACHE para protocolos HTTPS

El protocolo https nos permite establecer conexiones seguras con el servidor para la comunicación de datos sensibles como contraseñas, nº de cuenta, datos personales, etc.

01-Feb-2016

Muchas veces escuchamos la frase: ‘asegúrate de que la conexión es segura’ cuando realizamos compras o validación de datos en webs con usuario y contraseña.

Lo que nos aseguramos con este protocolo es que la información que circula entre cliente (nuestro navegador) y servidor web está encriptada y en el caso de que sea interceptada será muy difícil que descubran su contenido a menos que se conozca la clave privada para descodificar la información.

El Protocolo Seguro de Transferencia de Hiper-Texto (HTTPS) es la versión segura del http (HyperText Transfer Protocol) que todos conocemos y utilizamos habitualmente. La diferencia es que, con HTTP podemos desarrollar actividades ecommerce, ya que permite realizar transacciones de forma segura.

Para poder utilizar el protocolo HTTPS en nuestro servidor web, es necesario activar el protocolo criptográfico SSL para el que Apache ofrece soporte, creando los archivos de claves y certificados obligatorios. Estos certificados de seguridad se conocen como SSL (Secure Sockets Layer / Capa de Conexión Segura).

En los navegadores comunes, cuando estamos empleando un protocolo https podemos ver el icono de un candado, que aparece en la barra principal de nuestro navegador. Además, en la barra de direcciones podremos ver que “http://” será sustituido por “https://”.

Creación de la clave y el certificado

Archivos .key y .crt

Todas las operaciones de configuración las tendremos que hacer con la cuenta del administrador (root), por lo que lo primero que haremos cuando nos conectemos al servidor por telnet con el programa putty, será ejecutar el comando ‘su’ para convertirnos en administrador del sistema.

Creamos dos directorios especiales para la clave y el certificado en el directorio de apache24 (/usr/local/etc/apache24).

$ su
Password:
# cd /
# mkdir /usr/local/etc/apache24/ssl.key
# mkdir /usr/local/etc/apache24/ssl.crt

Establecemos permisos sólo para el administrador sobre estas carpetas:

# chmod 0700 /usr/local/etc/apache24/ssl.crt
# chmod 0700 /usr/local/etc/apache24/ssl.key

Nos desplazaremos a la carpeta principal del usuario root para continuar el proceso:

# cd /root

Generamos la clave RSA con el comando openssl: (server.key)

# openssl genrsa -des3 -out server.key 1024
 Generating RSA private key, 1024 bit long modulus
 ......................................................++++++
 .....................++++++
 e is 65537 (0x10001)
 Enter pass phrase for server.key:           → incluir la contraseña que se utilizará para encriptar ←
Verifying - Enter pass phrase for server.key: → repetir la contraseña ←

Generamos el archivo con la información de solicitud del certificado con nuestros datos o los datos de la organización: (server.csr)

Se nos solicitará la información referente a: país, provincia, ciudad, nombre de la organización, departamento o sección, nombre común (podemos indicar el nuestro), dirección de correo, nueva clave y nombre opcional de la compañía.

# openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key: 			→ Contraseña del server.key ←
You are about to be asked to enter information that will be incorporated into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:         → Abreviatura del país ES ←
State or Province Name (full name) [Some-State]:  → Provincia ←
Locality Name (eg, city) []:            → Ciudad ←
Organization Name (eg, company) [Internet Widgits Pty Ltd]: → Nombre empresa u organización ←
Organizational Unit Name (eg, section) []:     → Unidad organizativa o departamento ←
Common Name (e.g. server FQDN or YOUR name) []:   → Nombre común (puede ser el vuestro) ←
Email Address []:                  → Correo electrónico ←

Please enter the following 'extra' attributes to be sent with your certificate request
A challenge password []:     → Contraseña extra (no es obligatoria) ←
An optional company name []:   → Nombre opcional de la compañía ←

Generamos el certificado x509 con el archivo de clave y el archivo de solicitud creados en los apartados anteriores, dándole un periodo de validez de 730 días (2 años). Este comando nos generará el fichero .crt que contendrá el certificado. (server.crt)

# openssl x509 -req -days 730 -in /root/server.csr -signkey /root/server.key -out /root/server.crt 
Signature ok
subject=/C=ES/ST=Valencia/L=Valencia/O=MiNubeInformatica/OU=Informatica/CN=Luis Roca Buso/emailAddress=webmaster@minubeinformatica.com
Getting Private key
Enter pass phrase for /root/server.key: → Contraseña del server.key ←

Al finalizar el proceso si mostramos el contenido del directorio root observaremos que tenemos los 3 archivos generados durante todo el proceso clave (key), solicitud (src) y certificado (crt).

# chmod 0700 /usr/local/etc/apache24/ssl.crt
# chmod 0700 /usr/local/etc/apache24/ssl.key

Podemos realizar un listado del directorio para mostrar los archivos creados

# ls -l
-rw-r--r-- 2 root wheel  966 12 ago 17:27 .cshrc
-rw-r--r-- 1 root wheel  149 12 ago 17:27 .k5login
-rw-r--r-- 1 root wheel  297 12 ago 17:27 .login
-rw-r--r-- 2 root wheel  254 12 ago 17:27 .profile
-rw------- 1 root wheel 1024 3 feb 22:16 .rnd
-rw-r--r-- 1 root wheel 1042 3 feb 22:16 server.crt
-rw-r--r-- 1 root wheel  798 3 feb 22:15 server.csr
-rw-r--r-- 1 root wheel  963 3 feb 22:14 server.key

El siguiente paso consiste en copiar los archivos creados a las carpetas ssl de apache que creamos al principio de todo el proceso.

# cp /root/server.key /usr/local/etc/apache24/ssl.key/server.key
# cp /root/server.crt /usr/local/etc/apache24/ssl.crt/server.crt

Establecemos permiso de lectura sólo para el administrador sobre estos archivos:

# chmod 0400 /usr/local/etc/apache24/ssl.crt/server.crt   
# chmod 0400 /usr/local/etc/apache24/ssl.key/server.key

Configurar los archivos de apache

Fichero httpd-ssl.conf (configuración ssl)

Editar el fichero httpd-ssl.conf de la carpeta /usr/local/etc/apache24/extra y configurar  las líneas del servidor virtual.

<VirtualHost _default_:443> → Línea 121 aprox. ←

#  General setup for the virtual host
DocumentRoot "/mnt/webapps/www"  → Carpeta que establecimos como raíz de documentos de apache ←
ServerName localhost:443     → Nombre del servidor establecido en el fichero httpd.conf ←
ServerAdmin webmaster@minubeinformatica.es → Email establecido para el administrador en el fichero httpd.conf ←
ErrorLog "/var/log/httpd-error.log"
TransferLog "/var/log/httpd-access.log"
SSLCertificateFile "/usr/local/etc/apache24/ssl.crt/server.crt"
SSLCertificateKeyFile "/usr/local/etc/apache24/ssl.key/server.key"

Fichero httpd.conf (configuración apache)

Editar el fichero de configuración de apache httpd.conf (/usr/local/etc/apache24)
Habilitar los módulos (mod_ssl y mod_socache_shmcb) quitando los comentarios a las líneas:

LoadModule socache_shmcb_module libexec/apache24/mod_socache_shmcb.so  → Línea 89 aprox. ←
LoadModule ssl_module libexec/apache24/mod_ssl.so            → Línea 141 aprox. ←

Incluir el fichero httpd-ssl.conf eliminando el comentario a la línea:

# Secure (SSL/TLS) connections
Include etc/apache24/extra/httpd-ssl.conf → Línea 512 aprox. ←

Realizar cambios en la sección Directory:

<Directory />    → Línea 226 aprox. ←
  AllowOverride none
  #Require all denied  → Comentar ←
  order allow,deny   → Añadir ←
  allow from all    → Añadir ←
</Directory>

Evitar que nos solicite la clave cada vez que iniciemos el servicio

Cada vez que iniciemos el servicio de Apache, se nos solicitará la clave del fichero server.key.

Performing sanity check on apache24 configuration:
Syntax OK
Starting apache24.
Apache/2.4.18 mod_ssl (Pass Phrase Dialog)
Some of your private key files are encrypted for security reasons.
In order to read them you have to provide the pass phrases.

Private key localhost:443:0 (/usr/local/etc/apache24/ssl.key/server.key)
Enter pass phrase:

Para evitar que nos solicite la clave cada vez que iniciemos el servicio, utilizaremos el comando openssl para crear un fichero de clave especial con autoclave.

Pasos:

  • Crearemos una copia del fichero server.key original
  • Crearemos el nuevo fichero de claves basándonos en esta copia
# cd /usr/local/etc/apache24/ssl.key
# cp server.key server.key.orig
# openssl rsa -in server.key.orig -out server.key
Enter pass phrase for server.key.orig: → Contraseña ←
writing RSA key

Por ultimo reiniciar el servidor apache:

# apachectl restart

Comprobar que todo funciona

Para comprobar que funciona el soporte ssl abriremos nuestro navegador e indicaremos la dirección ip del servidor utilizando el protocolo https.

acceso-con-https

Si nos muestra la página de inicio que creamos en el capítulo anterior ‘Instalar servidor Apache’, significará que todo funciona de forma correcta y que los datos habrán sido enviados a nuestro navegador de forma cifrada.

Cuando lo ejecutemos por primera vez, los navegadores nos advertirán de que el certificado no proviene de una entidad certificadora conocida o de confianza. Ante esta situación tendremos que indicar que añadan una excepción de seguridad para este certificado y que es de confianza.

Según el navegador que utilicemos actuaremos de la siguiente manera:

Internet Explorer

Problema con el certificado en Internet Explorer

Una vez aceptada la opción ‘Vaya a este sitio web’, nos mostrará la página de inicio de nuestra web y nos indicará que se produjo un error en el certificado ya que nuestro certificado no ha sido emitido por ninguna autoridad certificadora (no pasa nada).

Inicio https desde Internet Explorer

Google Chrome

Problema con el certificado en Chrome

De igual manera que ocurría con el explorador Internet Explorer, Chrome nos advertirá de que el certificado no es seguro (igualmente no pasa nada).

Inicio https desde Chrome

Mozilla Firefox

Problema con el certificado en Firefox
Añadir excepción en Firefox