Feb 192013
 
Artículo Apache

Un sitio web que ofrece un servicio de comercio electrónico, o de cualquier otro tipo que requiera solicitar al usuario información confidencial, debe proteger el envío de esta información, pero el protocolo HTTP que normalmente utiliza un servidor web no ofrece la seguridad necesaria para este tipo de uso.

La manera más habitual de mejorar la seguridad es establecer una conexión SSL, por la cual se transmiten encriptados los documentos que se intercambian el cliente y el servidor sobre protocolo HTTP. La combinación HTTP+SSL es conocida como HTTPS (HTTP seguro).

En este artículo se detallan los pasos a seguir para configurar un servidor web Apache sobre un servidor Linux para que el servicio que ofrece utilice https.

Prerequisitos

En este artículo se supone que el lector ya dispone de un servidor web Apache instalado y operativo, con el módulo mod_ssl habilitado, y también tiene instalado openssl.

En caso contrario, se puede encontrar información sobre estos elementos en:

 

Introducción a SSL

SSL utiliza una técnica de criptografía asimétrica, normalmente conocida como criptografía de clave pública (PKI, Public Key Cryptography).

Para ello, se crean dos claves, una pública y otra privada. Cualquier información encriptada con una de las claves sólo puede ser desencriptada con la otra. El servidor encripta los datos con la clave privada, y entrega al navegador la clave pública, que le permite descriptar la información.

Pero además es necesario un certificado firmado por una autoridad de certificación (CA, Certificate Authority) para evitar ataques de suplantación de personalidad.

De modo que el proceso completo de implementación de HTTPS incluye los pasos:

  • Generación de las claves publica y privada.
  • Generación de una solicitud de certificado (CSR, Certificate Signing Request) y envío del mismo a una autoridad de certificación.
  • Instalación de las claves y del certificado en el servidor web.

Generación de la clave privada

Para generar tanto las claves como el CSR utilizamos el comando openssl.

En primer lugar, creamos una clave privada RSA. Esta es una clave de 1024 bits encriptada con Triple-DES y almacenada en formato PEM, de modo que puede ser examinada en un editor de texto. Al comando se le pueden pasar una serie de ficheros con cualquier contenido, que funcionarán como “semillas” que ayudan a hacer la clave más segura. Una buena elección son ficheros de texto que hayan sido comprimidos con una herramienta como gzip.

El comando para generar la clave es:

EL comando solicitará una “pass-phrase”, y guardará la clave en el fichero “server.key”. La pass-phrase debe ser conservada de forma segura, y no ser olvidada.

Eliminación de la encriptación de la clave privada

Un problema con el uso de una clave protegida con una pass-phrase es que cada vez que el servidor Apache se inicie, solicitará dicha pass-phrase. Para evitarlo, podemos eliminar la encriptación Triple-DES de la clave. Pero en este caso, tenemos que tomar todas las precauciones para asegurar que sólo el usuario root tiene permisos de lectura del fichero que contiene la clave privada.

El comando para eliminar la encriptación de la clave privada es:

Generación del CSR

El siguiente paso es generar una solicitud de firma de certificado (CSR). La solicitud se enviará a una Autoridad de Certificación como Thawte o Verisign, que verificarán la identidad del solicitante y entregarán un certificado firmado.

Otra posibilidad es auto-firmar el CSR. Con un certificado auto-firmado, la encriptación SSL funcionará, pero el navegador presentará al usuario un aviso cada vez que acceda al servidor web.

El comando para generar el CSR es:

Durante la generación del CSR se solicitan una serie de datos, entre los cuales está el “Common Name”. El valor de este dato debe ser el nombre de dominio del servidor (por ejemplo, “www.ejemplo.com”)

A continuación se muestra un ejemplo de una sesión de generación de un CSR:

 

Generación de un certificado auto-firmado

Si no se tiene intención de utilizar una autoridad de certificación, o simplemente para probar la implementación de SSL en el sitio mientras se espera a recibir el certificado firmado, se puede generar un certificado auto-firmado. Para generar un certificado auto-firmado válido durante 60 días, utilizamos el comando:

 

Instalación de la clave privada y del certificado

Para instalar la clave privada y el certificado, localizamos el directorio de configuración de apache (por ejemplo, en Debian es “/etc/apache2”), creamos bajo él un subdirectorio “ssl”, y copiamos en el mismo los ficheros “server.pem” y “server.crt” obtenidos previamente.

A continuación, añadimos las directrices SSL en el fichero de configuración de apache. En el siguiente ejemplo vemos la configuración básica de un VirtualHost “www.dominio.com”:

Como vemos, utilizamos el puerto 443, que es el puerto https por defecto.

Debido a la naturaleza de la encriptación SSL, en un servidor es posible definir un único VirtualHost SSL por cada dirección IP disponible. Para ello, basta con sustituir _default_ por la dirección IP correspondiente.

Por el contrario, cuando se utiliza el protocolo HTTP no seguro es posible definir varios Virtual Hosts basados en nombre (HTTP 1.1) para una misma dirección IP.

Y con esto, tras reiniciar el servidor apache, ya es posible acceder al mismo utilizando https:// en lugar de http://.

Si estamos utilizando el certificado auto-firmado, el navegador presentará un aviso. Por ejemplo, en Firefox:

ssl-warning

Haciendo click en “I Understand the Risks”, se cargará la página, y en la barra de estado del navegador aparecerá el icono de un candado, indicando que la transmisión está protegida por SSL. Y eso es todo !

 Publicado por en 9:36 pm

 Deja un comentario

(requerido)

(requerido)