Usando Certificados SSL de Cliente Como Sistema de Autenticación Web

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”.

Transcript of Usando Certificados SSL de Cliente Como Sistema de Autenticación Web

Page 1: Usando Certificados SSL de Cliente Como Sistema de Autenticación Web

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”.

Page 2: Usando Certificados SSL de Cliente Como Sistema de Autenticación Web

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# [email protected]

# # 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

Page 3: Usando Certificados SSL de Cliente Como Sistema de Autenticación Web

database = $dir/index.txt # archvio que guarda la bd de certificadosnew_certs_dir = $dir/certificados # dir que guarda los certificados generadoscertificate = $dir/certificadoCA.pem # nombre del archivo del certificado raízprivate_key = $dir/privado/cakey.pem # llave privada del certificado raízdefault_md = md5 # algoritmo de dispersión usadopreserve = 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, obligatoriostateOrProvinceName = match organizationName = matchorganizationalUnitName = optional # optional, campo opcionalcommonName = 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 512default_keyfile = key.pem # nombre de la llave privadadefault_md = md5 # algoritmo de dispersión a utilizarstring_mask = nombstr # caracteres permitidos en la mascara de la llavedistinguished_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 organizacion0.organizationName_default = Torres, S.A.organizationalUnitName = Departamento o divisionemailAddress = Correo electronico

Page 4: Usando Certificados SSL de Cliente Como Sistema de Autenticación Web

emailAddress_max = localityName = Ciudad o distritolocalityName_default = MedellinstateOrProvinceName = Estado o provinciastateOrProvinceName_default = AntioquiacountryName = Codigo del pais (dos letras)countryName_default = COcountryName_min = 2countryName_max = 2commonName = 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 certificadosbasicConstraints = CA:TRUE # especifica bajo que metodo identificar a la llave publica que sera certificadasubjectKeyIdentifier = 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 CAsubjectKeyIdentifier = 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

Page 5: Usando Certificados SSL de Cliente Como Sistema de Autenticación Web

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:FALSEextendedKeyUsage = serverAuth

Page 6: Usando Certificados SSL de Cliente Como Sistema de Autenticación Web

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

Page 7: Usando Certificados SSL de Cliente Como Sistema de Autenticación Web

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 />

Page 8: Usando Certificados SSL de Cliente Como Sistema de Autenticación Web

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

Page 9: Usando Certificados SSL de Cliente Como Sistema de Autenticación Web

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>

Page 10: Usando Certificados SSL de Cliente Como Sistema de Autenticación Web

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

Page 11: Usando Certificados SSL de Cliente Como Sistema de Autenticación Web

</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:FALSEextendedKeyUsage = clientAuth

Page 12: Usando Certificados SSL de Cliente Como Sistema de Autenticación Web

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

Page 13: Usando Certificados SSL de Cliente Como Sistema de Autenticación Web

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

Page 14: Usando Certificados SSL de Cliente Como Sistema de Autenticación Web

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.

Page 15: Usando Certificados SSL de Cliente Como Sistema de Autenticación 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.

Page 16: Usando Certificados SSL de Cliente Como Sistema de Autenticación Web

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

Page 17: Usando Certificados SSL de Cliente Como Sistema de Autenticación Web