lunes, 28 de junio de 2010

INTALACION DE SERVIDOR WEB SEGURO (Apache2 y OpenSSL).



(Certificados Digitales)

Nota1: La instalación realizada se ha hecho en Ubuntu 8.10 y los repositorios usados son los que vienen por defecto en el mismo; para las configuraciones en versiones anteriores deberían ser muy similares e incluso para Debian.

Nota2: Todos los comandos aplicados deben hacerse bajo root para Ubuntu puede hacerse así o anteponiendo el comando sudo.

Nota3: Es recomendable crear un directorio para que ahí se generen los archivos.

Nota4: En todos los comando que aparecen llaves, peticiones o certificados los colocare sin ninguna ruta porque estaré en el directorio donde se generaron, si no están dentro de esta se deberá especificar la ruta de las mismas.

 root@quicksilver# apt-get update

Con el comando anterior nos cercioramos de obtener los paquetes mas actualizados de nuestro repositorio

Instalación de Apache2.

Procedemos a instalar el servidor web apache2 es una buena opción a la hora de elegir un servidor web ya que cuenta con bastantes módulos con los que podemos trabajar; claro que existen muchos más, algunos mejores, otro peores pero eso dependerá del para que lo necesite.

root@quicksilver# apt-get install apache2

Instalación de OpenSSL.

SSL (Secure Socket Layer) es el que le proporcionara la seguridad a nuestro servidor por medo de unos certificados que crearemos más delante de forma gratuita.

root@quicksilver# apt-get install openssl

Entidad Certificadora (CA).

Para crear un certificado primero debemos crear una Entidad Certificadora (CA); a continuación veremos cómo, pero es aconsejable crear una carpeta porque se generaran algunos archivos durante el proceso.

root@quicksilver# openssl req -x509 -newkey rsa:2048 -keyout pkey.pem -days 3650 -out pcert.pem

El comando anterior nos servira para crear nuestra CA para certificados X509, las llaves se harán con un algoritmo de encriptación rsa de 2048 bits y nos creara dos llaves: pkey.pem que será la llave privada de nuestra entidad y pcert.pem que será la pública.

Luego nos pedirá que digitemos el password el cual debe ser privado y por supuesto “NO se nos debe olvidar”.Y por ultimo nos pedirá algunos datos personales o de la empresa la cual será la CA la cual le hemos especificado que tenga 10 años de vigencia con el comando days 3650.

Creacion de Certificados Digitales.

El paso a seguir es crear nuestro certificado ya que contamos con la CA y gracias a esto podremos crear tantos certificados como queramos y ya no tendriamos que repetir los pasos anteriores para crearlos.
El primer paso a seguir sera crear la llave privada de nuestro certificado.

root@quicksilver# openssl genrsa -des3 -out priv-cert.pem -passout pass:frase-privada 2048

En el anterior comando indicamos primero crear la llave Triple DES 2048 bits (-des3); recordemos que 3DES es un algoritmos de encriptacion que se utilizo mucho en algun momento, claro que ahora hay algunos más seguros. Indicamos que la llave se llamara priv-cert.pem y con una frase que la he llamado frase-privada que sera la clave de nuestra llave.

Lo que debemos hacer ahora sera una peticion de certificado, debemos tener presente que este no es el certificado pero con este ya podremos sacar el nuestro.

root@quicksilver# openssl req -new -subj "/DC=zero.org/OU=org/CN=zero" -key priv-cert.pem -passin pass:frase-privada -out petic-cert.pem

Hacemos una peticion e indicamos a quien pertenece el certificado (-subj), y ponemos entre comillas, en mi caso mi dominio llamado zero.org y usara la frase privada que hemos especificado (-passin pass:) anteriormente y por ultimo nos devolvera la peticion llamada petic-cert.pem y con esto ya podemos crear nuestro certificado.

Para nuestro certificado OpenSSL tiene un archivo de configuracion en el que debemos especificar algunas caracteristicas, este archivo el openssl.cnf ubicado en la ruta /etc/ssl pero para simplificar las cosas podemos crear nosotros mismos un archivo que le pasará a nuestro certificado las caracteristicas necesarios para montarlo en nuestro servidor.

root@quicksilver# nano conf1.txt

y agregaremos el siguiente texto:

basicConstraints = critical,CA:FALSE 
extendedKeyUsage = serverAuth

Con la primera linea nos aseguramos que cumpla con el X509v3 y con la RFC3280 y la segunda que sera para que nuestro certificado pueda aplicarse a un servidor que en este case sera el web (apache2).
Ahora si podemos crear nuestro certificado con las peticiones, llaves y archivos que hemos creado hasta el momento.

root@quicksilver# openssl x509 -CA pcert.pem -CAkey pkey.pem -req -in petic-cert.pem -days 3650 -extfile conf1.txt -sha1 -CAcreateserial -out certificado.pem

El certificado será de tipo X509 cuya CA está definida en el archivo pcert.pem y la clave privada de este se encuentra en pkey.pem, las caracteristicas o especificaciones del certificado ya se encuentran establecidas en el archivo de peticion (petic-cert.pem) y tendra una validez de 10 años (-days 3650) y como la configuración no la hicimos en openssl.cnf sino en el archivo de texto que hemos creado como conf1.txt lo hemos especificado con el comando –extfile conf1.txt luego utilizamos un algoritmo de encripcion sha1 (-sha1) también creamos un serial para identificarlo con el comando –CAcreateserial y por ultimo decimos que nos genere el certificado (certificado.pem) con el comando de salida –out certificado.pem.

Para finalizar nos pedirá el password de la entidad certificadora (CA) que lo esta realizando y listo, tenemos nuestro certificado hecho en casa y a fuego lento ;)

Ahora que hemos creado nuestro certificado nos resta añadirlo a nuestro servidor web para ello necesitaremos dos de nuestros archivos creados los cuales son: priv-cert.pem y certificado.pem los cuales por organización los podemos agregar a la carpeta ssl en /etc/apache2/ssl y si no existe lo podemos crear sino queremos no importa los podemos dejar en donde se han creado inicialmente en mi caso los deje en la primera carpeta donde se crearon en un principio.

Configuracion de Apache2 para SSL.

Hay un archivo en /etc/apache2/ llamado ports.conf allí podemos configurar los puertos de escucha del apache2 y como sabemos (o sino sabemos para que aprendamos J ) que el puerto seguro del servidor web es el 443 y debemos agregarlo al apache2 para que también pueda escuchar por este puerto:
Hay varias situaciones que se pueden presentar:

- La primera: esta es la que sucedió en mi caso y es que como yo trabaje en Ubuntu 8.10 después de haber hecho todo lo anterior ya me aparece el puerto 443 en escucha de la siguiente forma:

<IfModule mod_ssl.c>
         Listen 443
</IfModule>

Lo cual quiere decir que si el modulo ssl de apache esta activado que le permita escuchar por el puerto 443. Y por supuesto también debería estar Listen 80 que es por donde escucha las conexiones normales.

- La segunda: En algunas ocasiones solo aparece

Listen 80

y debemos agregar la siguiente línea

Listen 443 

y listo ya tenemos escuchando apache2 por los puerto 80 y 443.

Ahora tenemos que habilitarle el modulo a apache2 para que soporte ssl

root@quicksilver# a2enmod ssl

También debemos configurar un host virtual para poder acceder a nuestro sitio mediante https y lo podemos hacer en el archivo /etc/apache2/sites-available/default yo voy a mostrar como quedo mi archivo para que se puedan guiar, ya acomodaran el archivo a sus necesidades.

NameVirtualHost *:443
<VirtualHost *:443>
            ServerAdmin zero@localhost
            ServerName www.zero.org
            DocumentRoot /var/www/

            <Directory />
                        Options FollowSymLinks
                        AllowOverride None
            </Directory>

            <Directory /var/www/>
                        Options Indexes FollowSymLinks MultiViews
                        AllowOverride None
                        Order allow,deny
                        Allow from all
            </Directory>

            ScriptAlias  /cgi-bin/  /usr/lib/cgi-bin/

            <Directory “/usr/lib/cgi-bin/”>
                        AllowOverride None
                        Options +ExecCGI –Multiviews +SymLinksIfOwnerMath
                        Order allow,deny
                        Allow from all
            </Directory>

                        ErrorLog /var/log/apache2/error.log
                        # Possible values include: debug, info, notice, warn, error, crit,
                        # alert, emerg.
                        LogLevel warn
                        CustomLog /var/log/apache2/access.log combined
Alias    /doc/  “/usr/share/doc/”

            <Directory “/usr/share/doc/”>
                        Options Indexes MultiViews FollowSymLinks
                        AllowOverride None
                        Order deny,allow
                        Deny from all
                        Allow from 127.0.0.0/255.0.0.0 ::1/128
            </Directory>

                   #Lineas para el servidor
                   SSLEngine on
                   SSLCertificateFile /home/…/certificado.pem
                   SSLCertificateKeyFile /home/…/priv-cert
</VirtualHost>

SSLPassPhraseDialog exec:/etc/apache2/ssl-frase

Nota: Algo muy importante es la linea donde dice NameVirtualHost *:443 la cual debe ir, pero no necesariamente aquí; en mi Ubuntu 8.10 se encuantra en la ruta /etc/apache2/ports.conf pero si no lo encontramos aquí si debe ir en donde se configura el host virtual osea en /etc/apache2/sites-avilable/default

En DocumentRoot pondremos la ruta en donde se encuentra almacenada nuestra página en mi caso /var/www/ y con las líneas de configuración SSLEngine on, SSLCertificateFile, SSLCertificateKeyFile,  corresponden a que usaremos certificados, el certificado como tal y a la clave privada, respectivamente; cuidado que en estos dos ultimos debemos especificar la ruta exacta donde se encuentran.

Aunque no tuve que hacerlo, en algunos casos se recomienda crear un vinculo simbólico del archivo default, primero ingresamos en la ruta /etc/apache2/sites-enabled y luego creamos el vinculo de la siguiente forma; ln -s ../sites-availables/default default-000

Lo que hicimos fue crear un vinculo simbólico del archivo default que se encuentra en sites-availables a default-000 que se encuentra en sites-enabled, algo muy importante que debemos tener en cuenta es que estamos parados en la ruta etc/apache2/sites-enabled

Bueno para este caso solo restaría un paso y es reiniciar el servicio de apache2, pero vamos a realizar un pequeño truquito, lo que pasa es que cuando se reinicia apache2 o se apaga el servidor y vuelve y se prende, el servicio de apache se quedara parado hasta que ingresemos la frase privada entonces lo que haremos es crear  un pequeño archivo que haga esto automáticamente cada que se reinicie y no evite estar copiando la frase.

La verdad lo podemos almacenar y llamar en donde y como queramos, en mi caso será asi:

root@quicksilver# nano /etc/apache2/ssl-frase 

Luego agregamos dos pequeñas lineas :)

#!/bin/sh
echo mi_frase

Damos permisos de ejecución…

root@quicksilver# chmod 700 /etc/apache2/ssl-frase

y por ultimo agregamos una directiva mas en el host virtual, bueno o por lo menos en el mismo archivo pero debemos tener en cuenta que lo debemos poner por fuera de la configuración del host virtual osea que la podemos poner al final de todas las líneas.

SSLPassPhraseDialog exec:/etc/apache2/ssl-frase

Lo que hacemos con esta línea es que invoque el fichero bash ssl-frase cuando arranque apache y le “ejecute la clave” sin necesidad de que tengamos que hacerlo nosotros.

Nota: En el ejemplo del host virtual que puse unos pasos antes agregue esta línea, para mostrar cómo debería ir.

Y LISTO!!!!!   Porfin terminamos nuestro servidor apache2 con soporte ssl :)


Imprimir

0 comentarios:

 

Zero@configurE Copyright © 2008 D'Black by Ipiet's Blogger Template