Anda di halaman 1dari 17

Certificados SSL De Clientes Como Sistema De Autenticación Web

Debian Lenny.

A menudo creamos aplicaciones web con un backend de gestión que, por


ser también web, exponemos públicamente a cualquiera que consiga
averiguar la URL. Habitualmente estos sistemas son de acceso restringido,
sólo un pequeño grupo de usuarios lo utiliza.

En escenarios donde tenemos un gran numero de usuarios y se necesita


autentificación, se puede utilizar un mecanismo de certificados que
aporten mayor seguridad al sistema, de esta manera solo aquellos usuarios
que tengan el certificado en cuestión tendrán acceso a la máquina.

Veremos como permitir el acceso a nuestra aplicación a aquellos usuarios


que dispongan de un certificado que previamente les habremos enviado
mientras que si no lo tienen no podrán acceder de ningún modo. Este
método se puede combinar, además, con el tradicional usuario/clave para
dar mayor seguridad. Podremos incluso verificar que el nombre de usuario
que se intenta utilizar se corresponde con el certificado de usuario que le
hemos enviado y no intenta autentificarse con otro.

Los navegadores web reconocen, por defecto, una serie de autoridades


certificadoras como Verisign o Thawte, aunque hay muchas más. Puedes
verlas todas en las opciones de tu navegador. Pero, ¿qué es realmente lo
que hace una Autoridad Certificadora? Firmar. Firma tu certificado SSL
asegurando que si nos pertenece a nosotros y a nuestro dominio. Cuando
un cliente accede a tu dominio y descarga el certificado SSL, busca dentro
de sus certificados de CA’s si hay alguno que lo haya firmado. Si lo
encuentra, acepta tu certificado y no ocurre nada especial, pero si no
encuentra la CA lanza un aviso indicando que no se reconoce la autoridad
que lo firma. Esto no quiere decir que el certificado no sea válido, lo único
que ocurre es que no sabe quien lo firma. Esto significa, por tanto, que tú
mismo puedes ser tu propia autoridad certificadora y firmar tus
certificados, funcionarán perfectamente y cumplirá el objetivo de asegurar
las comunicaciones cliente-servidor.

Nota: Antes de empezar debemos tener configurado correctamente nuestro


DNS para nuestro caso utilizaremos el dominio “torres.com”.
1-instalamos el soporte para ssl

#apt-get install openssl

2-Creamos un directorio central para almacenar todo lo que tenga que ver
con la entidad certificadora

#mkdir /etc/ssl/CA

3-Generamos el archivo openssl.cnf con el que trabajara nuestra entidad.

/etc/ssl/CA#nano openssl.cnf y le agregamos las siguientes lineas

#
****************************************************************
*********************
# www.linuxtotal.com.mx
# sergio.gonzalez.duran@gmail.com
#
# Archivo de configuracion para openssl
#
# ***** openssl.cnf ******

dir = . # variable que establece el directorio de


trabajo

# seccion que permite convertirnos en una CA


# solo se hace referncia a otra sección CA_default
[ ca ]
default_ca = CA_default

[ CA_default ]
serial = $dir/serial # archivo que guarda el
siguiente número de serie
database = $dir/index.txt # archvio que guarda la bd de
certificados
new_certs_dir = $dir/certificados # dir que guarda los
certificados generados
certificate = $dir/certificadoCA.pem # nombre del archivo del
certificado raíz
private_key = $dir/privado/cakey.pem # llave privada del
certificado raíz
default_md = md5 # algoritmo de dispersión
usado
preserve = no # Indica si se preserva o no
el orden de los
# campos del DN cuando se
pasa a los certs.
nameopt = default_ca # esta opcion y la siguiente
permiten mostrar
# detalles del certificado
certopt = default_ca
policy = policy_match # indica el nombre de la
seccion
# donde se especifica que
campos son
# obligatorios, opcionales y
cuales deben ser
# iguales al certificado
raíz

# seccion de politicas para la emision de certificados


[ policy_match ]
countryName = match # match, obligatorio
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional # optional, campo
opcional
commonName = supplied # supplied, debe estar
en la petición
emailAddress = optional

# seccion que indica como los certificados deben ser creados


[ req ]
default_bits = 1024 # tamaño de la llave, si no se
indica 512
default_keyfile = key.pem # nombre de la llave privada
default_md = md5 # algoritmo de dispersión a
utilizar
string_mask = nombstr # caracteres permitidos en la
mascara de la llave
distinguished_name = req_distinguished_name # seccion para el
nombre distinguido (DN)
req_extensions = v3_req # seccion con mas extensiones
que se añaden a la
# peticion del certificado

# seccion del nombre distinguido, el valor es el prompt que se vera


en pantalla.
# datos del propietario del certificado.
# esta seccion define el contenido de datos de id que el
certificado llevara.
[ req_distinguished_name ]
0.organizationName = Nombre de la organizacion
0.organizationName_default = Torres, S.A.
organizationalUnitName = Departamento o division
emailAddress = Correo electronico
emailAddress_max =
localityName = Ciudad o distrito
localityName_default = Medellin
stateOrProvinceName = Estado o provincia
stateOrProvinceName_default = Antioquia
countryName = Codigo del pais (dos letras)
countryName_default = CO
countryName_min = 2
countryName_max = 2
commonName = Nombre comun (hostname o IP)
commonName_max = 64

# si en la linea de comandos se indica la opcion -x509,


# las siguientes extensiones tambien aplican
[ v3_ca ]
# indica que se trata de un certificado CA raíz con autoridad para
# firmar o revocar otros certificados
basicConstraints = CA:TRUE

# especifica bajo que metodo identificar a la llave publica que


sera certificada
subjectKeyIdentifier = hash

# especifica como identifcar la llave publica

authorityKeyIdentifier = keyid:always,issuer:always

# extensiones de la opcion req


[ v3_req ]
basicConstraints = CA:FALSE # los certificados firmados
no son CA
subjectKeyIdentifier = hash

#
**********************************************************************
***************

4- creamos el certificado y la llave privada de nuestra autoridad de


certificadora:

#openssl req -x509 -newkey rsa:2048 -days 3650 -keyout cakey.pem -out
certificadoCA.pem -config /etc/ssl/CA/openssl.cnf

Este comando genera dos archivos, la clave privada con la que firmaremos
nuestros futuros certificados y el certificado con la clave pública que
instalaremos, si queremos no recibir avisos, en el navegador web. Este
comando te pedirá algunos datos (nombre de empresa, país…) y, sobre
todo, una contraseña. Deberás recordarla cada vez que vayas a firmar un
certificado SSL, así que no la olvides; Ya tenemos nuestra CA creada.

5-Creamos ahora el certificado SSL para nuestro dominio:

#openssl genrsa -des3 -out claveprivada.pem 2048

#openssl req -new -key claveprivada.pem -out certificado.pem

El primer comando crea la clave privada de nuestro certificado. Te pedirá


otra contraseña, esta vez para la clave privada.

El segundo comando genera la petición de certificado sobre la clave privada


anterior. Te pedirá la contraseña de la clave privada anterior.

6-Firmaremos la solicitud de certificado con nuestra CA:

Para poder firmarlo debemos generar primero un fichero de texto con


algunos parámetros de configuración:

#nano configservidor.cnf

basicConstraints = critical,CA:FALSE
extendedKeyUsage = serverAuth
Y firmamos el certificado:

# openssl x509 -CA certificadoCA.pem -CAkey cakey.pem -req -extfile


configservidor.cnf -in certificado.pem -days 3650 -CAcreateserial -sha1 -out
certificado-cliente-web.pe.pem

Ya tenemos un certificado SSL preparado para utilizar en nuestro servidor


web. En nuestro caso es certificado-cliente-web.pe.pem.

Instalaremos nuestro servidor web:

#apt-get install apache2


7-Finalmente hay que indicarle al virtual host que quieres asegurar que
use nuestro nuevo certificado. Para hacerlo añadimos un nuevo virtual host
que escuche en el puerto 443 y añadimos las siguientes líneas:

SSLEngine on

SSLCertificateFile /etc/ssl/CA/certificado-cliente-web.pe.pem

SSLCertificateKeyFile /etc/ssl/CA/claveprivada.pem

#nano /etc/apache2/sites-availables/default

<VirtualHost *:80>

ServerAdmin webmaster@localhost

RedirectPermanent / https://torres.com

DocumentRoot /var/www/cuil

<Directory />
Options FollowSymLinks

AllowOverride None

</Directory>

<Directory /var/www/>

Options Indexes FollowSymLinks MultiViews

DirectoryIndex Cuil.html

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 +SymLinksIfOwnerMatch

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>

</VirtualHost>

<VirtualHost *:443>

ServerAdmin webmaster@localhost

ServerName torres.com

DocumentRoot /var/www/cuil

<Directory />

Options FollowSymLinks

AllowOverride None

</Directory>

<Directory /var/www/>

Options Indexes FollowSymLinks MultiViews

DirectoryIndex Cuil.html

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 +SymLinksIfOwnerMatch

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>

SSLEngine on

SSLCACertificateFile /etc/ssl/CA/certificadoCA.pem

SSLCertificateFile /etc/ssl/CA/certificado-cliente-web.pe.pem

SSLCertificateKeyFile /etc/ssl/CA/claveprivada.pem

SSLVerifyClient require
</VirtualHost>

8- habilitamos el modulos de ssl en apache para que nuestro host virtual


sea seguro.

#a2enmod ssl

Añadiendo el certificado al cliente web.

9- Ahora que ya tenemos nuestro servidor web seguro con nuestros


certificado auto firmado llega el momento de crear certificados para
nuestros clientes de manera que si alguien intenta acceder a nuestra
aplicación sin uno de ellos se le prohíba el paso.

Crearemos primero un archivo de configuración con los parámetros que


necesitaremos.

#nano configcliente.cnf

basicConstraints = critical,CA:FALSE
extendedKeyUsage = clientAuth
Con esto daremos instrucciones de que es un certificado cliente a la hora de
firmar el certificado.

Creamos ahora, igual que hacíamos antes, la clave privada y la solicitud de


certificado.

#openssl genrsa -des3 -out clave-cliente.pem 2048

#openssl req -new -key clave-cliente.pem -out certificado-cliente-req.pem


-config /etc/ssl/CA/openssl.cnf
Firmamos ahora el certificado con nuestra C:

# openssl x509 -CA certificadoCA.pem -CAkey cakey.pem -req -in


certificado-cliente-req.pem -days 3650 -extfile configcliente.cnf
-CAcreateserial -sha1 -out certificado-cliente.pem

10- El certificado que acabamos de generar lo debes instalar en tu


navegador web, no en el servidor, así que habrá que convertirlo a algún
formato que puedan entender. Para esto hacemos lo siguiente:

#openssl pkcs12 -export -in certificado-cliente.pem -inkey clave-cliente.pem


-certfile certificadoCA.pem -out cliente.p12

Nos pedirá la contraseña de la clave privada del certificado y nos solicitará


otra para el que va a generar. Es importante poner contraseña al certificado
final ya que es el que vas a enviar a tus usuarios y pretendes que sólo estos
puedan utilizarlo.

11-Ahora instalamos el certificado “cliente.p12”, en el browser.

Abrimos el browser en:

Editar >>>Preferencias>>>Avanzadas>>>Encriptacion>>>Ver
Certificados>>>

Sus Certificados>>>Importar
En el momento de importar el archivo nos pedirá la contraseña con que lo
creamos anteriormente.

Vemos como se ha instalado correctamente el certificado y se han


restaurado exitosamente sus certificados de seguridad y claves privadas.

Ahora podemos observar que nuestro certificado esta almacenado en el


cliente web.
12- Reiniciamos el servidor web.

#/etc/init.d/apache2 restart.

13- vamos al navegador y escribimos http://torres.com y miraremos como


nos direcciona al sitio web seguro https://torres.com y nos mostrara un
mensaje de alerta que dice que no confía en nuestro certificado; damos OK
y agregamos una excepción.
14-Después de agregar la excepción nos mostrara nuestro certificado
instalado en el navegador y cada uno de sus detalles; damos OK.

Al dar en OK nos mostrara el contenido web o sea nuestra pagina que esta
en un sitio web seguro (443).

Referencias:

http://blog.osusnet.com/2008/10/11/usando­certificados­ssl­de­cliente­como­sistema­de­
autenticacion­web/ 

www.google.com.co

Anda mungkin juga menyukai