El objetivo de este tutorial será construir un servidor
seguro gratuito (Apache + SSL) en nuestro ordenador personal bajo Linux. El
planteamiento del tutorial es puramente didáctico y recreativo. Si bien todo lo
dicho bien pudiera aplicarse a la creación de un servidor web seguro destinado
a dar servicio al público, nosotros mantendremos un ámbito más limitado para
el mismo: un servidor seguro que funcione -en principio- sólo en nuestra propia
máquina. Para ello, incluso lo dotaremos de un certificado también construido
por nosotros mismos, pero que carecería de cualquier validez fuera de nuestra máquina,
al no estar reconocido por ninguna autoridad de certificación externa. Aunque -insistimos-
todo lo dicho aquí sería de aplicación a un servidor web real (disponible
para conexión y uso público), en ese caso la configuración debería afinarse
mucho más de lo que aquí se dice.
Lógicamente, los servidores seguros no son privativos del entorno Linux, pero en esos otros casos no resulta posible trabajar -como aquí- a nivel del propio código de los programas, y siempre nos veremos obligados a utilizar "cajas negras", cuyo funcionamiento y características nunca podremos estudiar, comprender ni modificar, y mucho menos a los niveles que Linux nos permite.
1. Un sistema Linux instalado y funcionando. No debe haber
problema en esto: un mes sí y otro también, las principales revistas de informática
regalan alguna de las distribuciones más recientes. Si no tiene ninguna de
ellas a mano, descargar Linux gratis desde Internet es también posible, pero
resulta bastante más práctico adquirir, por muy poco dinero, alguna distribución
completa y reciente. En este artículo hemos utilizado Esware 1.1, distribución
española basada en Red Hat.
2. A pesar de que en su distribución Linux puedan venir
incorporadas versiones anteriores de los paquetes necesarios, recomendamos
descargar desde Internet las versiones más recientes de los siguientes ficheros:
1) Servidor web APACHE:
http://www.apache.org/dist/
Versión 1.3.12 en el momento de escribir este artículo:
fichero apache_1.3.12.tar.gz (1709 Kb)
2) OpenSSL:
http://www.openssl.org
Código criptográfico para SSL v.2/v.3 y TLs v.1.
Versión 0.9.5 en este momento:
fichero openssl-0.9.5.tar.gz (1886 Kb)
3) Parche SSL para Apache:
http://www.apache-ssl.org
Parches que permitirán disfrutar SSL en Apache.
fichero apache_1.3.12+ssl_1.39.tar.gz (47 Kb)
Existen también distribuciones RPM que ya contienen todo lo
necesario en un solo paquete y cuya instalación es sencillísima. No obstante,
usted suele perder el control sobre lo que instala. Alguna de ellas incorpora
incluso extensiones para Microsoft FrontPage 2000. Dado que estamos tratando de
un tema de estricta seguridad, y donde podemos disfrutar del lujo de disponer
del código fuente de todo lo que instala, aquí preferiremos seguir el camino más
largo y renunciar de antemano a tales comodidades. Dados los frecuentes fallos
de seguridad de los productos Microsoft, esa combinación en concreto no se
diferenciaría mucho (en nuestra opinión) de encargar al zorro que vigile a las
gallinas.
1. En primer lugar, procederemos a descomprimir el fichero que
contiene el código fuente del servidor web Apache. Para ello, sitúese en el
directorio a donde descargó su fichero apache_1.3.12.tar.gz y escriba en su
terminal lo siguiente:
cp apache_1.3.12.tar.gz /usr/local/src
cd /usr/local/src
tar xvfz apache_1.3.12.tar.gz
(NOTA: el directorio de instalación puede ser cualquiera de
su elección, distinto -por tanto- del aquí indicado.)
Observará que existe un nuevo directorio /usr/local/src/apache_1.3.12,
que contiene varios ficheros y directorios en su interior. Correcto.
2. Ahora instalaremos las librerías criptográficas que nos
permitirán disponer de SSL en el servidor que estamos construyendo. Desde su
directorio de download, teclee lo siguiente:
cp openssl-0.9.5.tar.gz /usr/local/src
cd /usr/local/src
tar xvfz openssl-0.9.5.tar.gz
Como en el apartado anterior, existirá ahora un nuevo
directorio llamado /usr/local/src/openssl-0.9.5. Sitúese en él y ejecute el
script de configuración:
cd /usr/local/src/openssl-0.9.5
./config
Procedemos ahora a compilar estas librerías:
make
make test
make install
Si todo fue bien, ahora dispondremos de un directorio /usr/local/ssl,
conteniendo todo lo necesario para que SSL pueda funcionar en su servidor.
3. Nos resta instalar nuestro tercer fichero, es decir, el
parche que permitirá que nuestro flamante Apache pueda hacer uso de las librerías
que acabamos de compilar en el paso anterior. El proceso es similar; vaya a su
directorio de download (donde descargó el fichero) y escriba:
cp apache_1.3.12+ssl_1.39.tar.gz /usr/local/src/apache_1.3.12
cd /usr/local/src/apache_1.3.12
tar xvfz
apache_1.3.12+ssl_1.39.tar.gz
En el fichero README.SSL contenido en este directorio aparecen
las instrucciones a seguir ahora. La opción más sencilla es escribir:
FixPatch
y el parche ajustará todo lo necesario.
A estas alturas, disponemos del código fuente de Apache listo
para ser compilado; le hemos aplicado el parche que le enseña a hacer uso de
SSL y disponemos de estas librerías criptográficas a punto en su propio
directorio. Sólo nos resta unirlo todo.
Para ello, procederemos a compilar nuestro servidor Apache. Es
tan sencillo como desplazarnos al directorio donde instalamos los fuentes:
cd /usr/local/src/apache_1.3.12
y escribir los comandos habituales:
config
make
make install
Al final del proceso, tendremos nuestro flamante Apache-SSL prácticamente a punto.
Necesitaremos ahora un certificado digital para nuestro
servidor seguro, que garantice su legitimidad a quien se conecte a él.
Como ya dijimos al principio, lo construiremos nosotros mismos
y nos servirá para nuestras pruebas, sin necesidad de pagar a una autoridad
externa para que nos certifique un servidor que -recuerde- en principio sólo
utilizaremos nosotros mismos.
Escriba:
cd /usr/local/ssl/bin
openssl req -new
> new.cert.csr
Responda a las preguntas que se le plantean ahora. En primer
lugar, se le pide una contraseña para proteger su clave. Decida una y confírmela.
Ahora responda con las iniciales de su país, provincia, ciudad, organización,
sección, nombre y e-mail. Resultarán dos nuevos ficheros: new.cert.csr y
privkey.pem.
Escriba ahora:
openssl rsa -in privkey.pem -out
new.cert.key
Vamos a firmar nuestro certificado con:
openssl x509 -in new.cert.csr -out
new.cert.cert -req -signkey new.cert.key -days 365
El nuevo fichero new.cert.cert contiene ahora su certificado
de prueba.
Creemos un directorio para almacenar nuestros certificados:
mkdir /usr/local/httpsd/certs
Y traslademos allí nuestros flamantes certificados y clave:
cp /usr/local/ssl/bin/new.cert.key /usr/local/httpsd/certs
cp /usr/local/ssl/bin/new.cert.cert
/usr/local/httpsd/certs
Para informar a Apache sobre esta localización de los
certificados tendremos que modificar su fichero de configuración (/usr/local/httpsd/conf/httpsd.conf).
Lo abriremos con un editor y añadiremos hacia el final del mismo las siguientes
líneas:
SSLSessionCacheTimeout 300
SSLCACertificatePath
/usr/local/httpsd/certs
SSLCertificateKeyFile
/usr/local/httpsd/certs/new.cert.key
SSLCACertificateFile
/usr/local/httpsd/certs/new.cert.cert
SSLCertificateFile
/usr/local/httpsd/certs/new.cert.cert
Ahora Apache ya sabe dónde buscar.
Casi todo está a punto, pero antes de arrancar nuestro
flamante servidor seguro hay que resolver otra cuestión: ¿podemos usar un
servidor web seguro y otro no seguro en la misma máquina? Por suerte, la
respuesta es sí. Es posible correr dos demonios del servidor web, pero es mucho
más sencillo definir un servidor virtual seguro y otro no seguro.
La forma de hacer esto es editar nuestro fichero de
configuración del servidor (/usr/local/httpsd/conf/httpsd.conf). En su sección
final (Sección 3) añadiremos unas cuantas líneas que definirán ambos hosts
virtuales (seguro y no seguro). Existe un fichero de ejemplo en:http://www.apache-ssl.org/httpd.conf.example,
que incluye también lo relativo a localización de certificados (párrafo
anterior). Adapte este fichero a sus necesidades específicas.
De esta forma, cuando escribamos en nuestro navegador la dirección http://127.0.0.1 nuestro servidor deshabilitará el uso de SSL, mientras que cuando escribamos https://127.0.0.1 se tratará de una transferencia segura.
Para probar nuestro servidor web tendremos que arrancarlo
mediante el comando:
/usr/local/httpsd/bin/httpsdctl start
Abra su navegador y teclee las direcciones comentadas en el párrafo
anterior. Si todo va bien, se abrirá la página por defecto de Apache (que
luego podrá sustituir por sus propios documentos). En caso de error, revise
todos los puntos anteriores y (si eso no basta) acuda a las fuentes recomendadas
al final de este artículo.
Para detener el servidor escriba:
killall httpsd