lunes, 28 de junio de 2010

Servidor WEB bajo SSL que exija el certificado a los clientes (Apache2 - OpenSSL)

9 comentarios
Nota: Para el siguiente caso hablaremos de una entidad certificadora (CA) ya creada es mas este post es un anexo al anterior que es como configurar el servidor con ssl y lo podemos encontrar en la sección del blog:

Intalacion de Servidor Web Seguro (Apache2 - OpenSSL) 

Es muy importante entender el post anterior para poder llevar a cabo este, ya que estos temas estan muy ligados y se siguio el proceso por decirlo asi para no tener que repetir algunas cosas.

Nota2: Recordemos que al generar nuestra CA, generamos algunos importantes los cuales son: pcert.pem, pkey.pem, pcert.srl (certificado de la CA, llave de la CA, serial de la CA “respectivamente”); algo que debemos recordar siempre es la clave o frase que le pusimos a nuestra CA  (ver post anterior).

También generamos el certificado para el servidor web para el cual se crearon 2 archivos, en el post anterior; el certificado y la llave de este, (certificado.pem, priv-cert.pem).

Certificado del Cliente

Procederemos a crear nuestro certificado para el cliente y lo primero que deberíamos hacer es crear un directorio para que ahí se generen los certificados y demás, también debemos incluir en este los archivos generados para la CA (Entidad Certificadora).

Lo que haremos en un principio será generar la clave privada de nuestro certificado cliente:

root@quicksilver# openssl genrsa -des3 -passout pass:password1 -out client-priv.pem 2048
Bueno, lo que hicimos aqui fue generar la clave con un algoritmo triple des (-des3) con una frase para nuestra clave privada llamada password (-passout pass:password1), nuestra llave será un archivo llamado client-priv.pem (y lo creamos o damos salida con -out) y tendra una longitud de 2048 bits.

Ahora generaremos la petición del certificado:

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

Podemos observar que con el parámetro (req -new) estamos indicando que será una petición que le pasaremos la clave privada creada anteriormente client-priv.pem con el comando (-key) y posteriormente le indicamos la frase de dicha clave (-passin pass:password1), con el comando (-subj) le indicamos a quien pertenece el certificado, para ello ponemos entre comillas cada uno de los apartados que identifican separados por /, además ponemos el dominio o apartado al que pertenece en mi caso zero.org y con el parámetro CN indicamos el nombre del cliente que va dirigido aquí pusimos el nombre de Victor y por ultimo damos salida a nuestra petición (-out) y se llamara petic-cert-client.pem.

Y por ultimo podremos crear nuestro certificado, para esto debemos indicar en el archivo de configuración /etc/ssl/openssl.cnf como será nuestro certificado. Pero como lo hicimos anteriormente crearemos un archivo independiente y le pasaremos los parámetros necesario desde ahí.

root@quicksilver# nano config2.txt

Creamos el archivo con el siguiente contenido:


basicConstraints = critical,CA:FALSE 
extendedKeyUsage = clientAuth

Y lo guardamos, en el fichero le indicamos el basicConstraints=critical,CA:FALSE para que cumpla con el X509v3 y con la RFC3280. Y también le indicamos que el certificado servira para acceso a un servidor por lo que será una autenticación cliente y esto lo hacemos con la línea extendedKeyUsage = clientAuth.

Ahora si creamos nuestro certificado cliente:

root@quicksilver#  openssl x509 -CA pcert.pem -CAkey pkey.pem -req -in petic-cert-client.pem -set_serial 3 -days 365 -extfile config2.txt -sha1 -out client-cert.pem

Le indicamos que será un certificado del tipo x509 cuya CA (-CA) está definida en el archivo pcert.pem y usa como clave privada (-CAkey) el fichero pkey.pem y el certificado a generar tendrán las especificaciones definidas en la petición (-req -in) las cuales están en el fichero de petición petic-cert-client.pem.

El certificado tendrá una validez de un año (-days 365). Y le indicamos que el certificado es para un cliente, como esto lo tenemos en nuestro Archivo de configuración se lo indicamos con (-extfile) y nuestro archivo config2.txt y utilizaremos un algoritmo de cifrado SHA (-sha1).

Luego como nuestra CA tenía el número 1 y nuestro primer certificado era el certificado 2 este nuevo certificado sera el 3 y los proximos certificados a generar serán el 4,5,6... Esto se le indica mediante el parámetro (-set_serial). Si esta numeración no se pone correctamente tendremos un problema con nuestro certificado.

Generamos el certificado (-out) en el fichero cliente-cert.pem. Al ejecutar esta línea nos pedirá el password que le pusimos a nuestra CA y al ponérselo obtendremos el fichero client-cert.pem que es nuestro certificado.

Configuracion del hostvirtual del servicio apache2.

Al igual que en la parte anterior debemos agregar unas líneas en el host virtual para que pida el certificado cliente.

root@quicksilver# etc/apache2/sites-available/default

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
                  #Lineas para el cliente
                  SSLCACertificateFile /home/…/pcert.pem
                  SSLVerifyClient require

</VirtualHost>
SSLPassPhraseDialog exec:/etc/apache2/ssl-frase

Podemos ver que las nuevas líneas del cliente son: 

            SSLCACertificateFile /home/…/pcert.pem
SSLVerifyClient require

La primera, osea; SSLCACertificateFile /home/…/pcert.pem le indicamos donde tenemos nuestra CA (la ruta) y con la segundo; SSLVerifyClient require le exigimos al servidor web que pida el certificado cliente.

Recordemos que la opcion SSLPassPhraseDialog exec:/etc/apache2/ssl-frase la utilizamos en el post anterior y alli especificamos el contenido, la ruta y permisos del archivo ssl-frase, de nuevo les dejo el enlace del otro post:

Intalacion de Servidor Web Seguro (Apache2 - OpenSSL) 

Guardamos el fichero /etc/apache2/sites-availables/default y creamos un vinculo simbólico de este en el /etc/apache2/sites-enabled, es decir:

root@quicksilver# cd /etc/apache2/sites-enabled
root@quicksilver# ln -s etc/apache2/sites-availables/default default-000

Bueno, nos resta reiniciar el servidor web para que agregue los cambios.

root@quicksilver# /etc/init.d/apache2 stop
root@quicksilver# /etc/init.d/apache2 start

Ya tenemos nuestro servidor el cual a la hora de conectarnos mediante https a este nos pedirá un certificado y si no lo tenemos no nos abrira la página. 

Incorporación del Certificado Cliente al  Navegador

Ahora vamos a coger nuestro certificado cliente y se lo vamos a incorporar a nuestro navegador, para ello necesitamos crear con nuestro certificado un fichero comprimido en formato pkcs12 que el navegador es el que acepta.

La conversión la podemos realizar de la siguiente forma:

root@quicksilver# openssl pkcs12 -export -in client-cert.pem -inkey client-priv.pem -certfile cacert.pem -out cert-pck12.p12

Al ejecutar esto nos pedirá la passphrase del certificado cliente, en mi caso puse password1. También nos pide Export Password, que es un password que tenemos que poner para comprimir el archivo. Luego al importar el certificado en un navegador nos lo pedirá.

Posteriormente nos pide que verifiquemos el Export Password, es decir que lo volvamos a poner para comprobar que lo pusisteis bien.

Y ahora para ponerlo, abrimos el mozilla firefox (por ejemplo) y nos vamos al ménu Edit. Allí seleccionamos Preferences y dentro de la ventana que nos sale nos situamos sobre Advanced y con el scroll buscamos hasta encontrar Manage Certificate y le damos al import y ponemos el archivo cert-pck12.p12 que es nuestro certificado cliente.

Le ponemos el password que habiamos puesto cuando lo exportamos y  ya tenemos el navegador con vuestro certificado cliente cargado.



Imprimir
 

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