Certificados
Introducción
El RSA es un algoritmo de cifrado asimétrico,
esto significa que se utilizan 2 claves, una pública y otra privada
para el cifrado y descifrado de la información. Si se cifra un mensaje
con una de las dos llaves, el único método de descifrarlo es
mediante el uso de la otra llave complementaria y la obtención de una
clave a partir de la otra resulta -de momento- computacionalmente inviable.
Los nombres de llave pública y privada se deben a que la privada la
guardaremos a buen recaudo para que nadie tenga acceso a ella y, la pública,
es la que deberán conocer todos aquellos a quienes pretendemos mandar
información cifrada. Veamos como se utilizan en la práctica
estas llaves para conseguir una comunicación cifrada:
Confidencialidad.
Si el individuo A quiere enviar información cifrada
al individuo B, cifrará el mensaje con la llave pública de B
-que previamente éste le habrá proporcionado-. Tal mensaje,
sólo podrá ser descifrado por la llave complementaria a la que
fue cifrado, es decir, la privada de B. En principio, solo B debería
poseer esta llave, así que solo B sería capaz de conocer el
contenido del mensaje.
Autenticidad.
Si en cambio, al individuo A le da igual que el mensaje sea leído
por más personas, pero quiere asegurar que el autor es él, enviará
el mensaje a B cifrándolo con la llave
Ka, la privada de A
(nuestra llave privada no correrá peligro por cifrar un mensaje y
emitirlo). Igual que antes, el mensaje cifrado solo podrá ser descifrado
por la llave complementaria, en este caso,
Pa, lo que asegura que
el mensaje fue emitido por él.
Confidencialidad + Autenticidad.
También es posible que queramos hacer las dos cosas, cifrar un
mensaje aparte de asegurar que es nuestro. En este caso
debemos cifrar
primero el mensaje con nuestra llave privada (lo firmamos) y a continuación
lo ciframos con la llave pública del destinatario:
mensaje_cifrado = Cifrar_con_Pb (Cifrar_con_Ka
(mensaje_original))
De esta forma, únicamente B sabrá que le
hemos enviado un mensaje firmado. Esto no ocurriría si invirtiéramos
el orden del cifrado:
mensaje_cifrado = Cifrar_con_Ka (Cifrar_con_Pb
(mensaje_original))
Ya que en este caso, cualquiera que conociese nuestra
llave pública sabría que le hemos enviado un mensaje cifrado
-y firmado- a B, perdiendo parte de la confidencialidad que en un principio
queríamos.
Llaves de sesión.
Hasta aquí hemos visto el uso simple de las llaves pública
y privada para el cifrado de la comunicación. En este momento se pueden
plantear dos problemas: Los algoritmos de cifrado resultan bastante lentos
computacionalmente, ¿Que ocurre si el mensaje que envíamos es
bastante largo y cuesta mucho tiempo de cifrar/descrifrar? y ¿Si
deseo enviar un mensaje cifrado a varia gente, tengo que cifrar el mensaje
con todas las claves públicas de los destinatarios?
Ambas preguntas se resuelven con el uso de llaves de sesión.
El proceso consiste en cifrar el mensaje con un algoritmo simétrico
(por ejemplo el DES) con una llave que generamos para tal evento. Puesto que
es un algoritmo simétrico, deberá ser descifrado también
con esta misma llave. Y como enviar la llave sin que nadie -excepto los destinatarios-
la pueda leer? Pues volvemos al uso de las llaves pública y privada.
Si tenemos el problema del mensaje largo, los algoritmos simétricos
resultan mucho más rápidos que los asimétricos, así
que cifraremos el mensaje, y la llave de sesión generada será
lo que cifraremos con la llave pública del destinatario.
Si en cambio, lo que queremos es enviar un mensaje cifrado a más
de un destinatario, no será preciso realizar un cifrado por cada una
de las llaves públicas de éstos. Nuevamente generaremos una
llave de sesión, cifraremos el mensaje con esta llave, y será
ésta, con un tamaño muy corto, la que cifraremos con cada llave
pública de los destinatarios. Estos descifraran la llave de sesión
con su privada y podrán leer el mensaje, sin que la comunicación
aumente notablemente su tamaño.
Estas llaves de sesión también se suelen utilizar para comunicación
con servidores, cuando queremos asegurar que el servidor es efectivamente
el que creemos que es, pero esto ya se aparta de nuestros objetivos. En cualquier
caso, las llaves de sesión no se almacenan en ningún sitio más
que en memoria temporal y se borran al finalizar una comunicación.
2. Certificados.
Un certificado viene a ser algo así como el
objeto que relaciona la llave pública de un individuo (bien puede ser
una empresa, un servidor, etc.) con la descripción de éste.
Es pues lo que enviaremos a todos aquellos con quienes queramos mantener comunicaciones
cifradas, aparte de tenerlos correctamente
instalados
en las aplicaciones que se encarguen del cifrado/descifrado de la información,
como pueden ser los navegadores o los gestores de correo.
Con el fin de que estos objetos sean fiables y se asegure que no han sido
modificados, llevan consigo la firma de la autoridad certificadora (CA) que
lo generó y una firma digital que se consigue aplicando un
hash o resumen al certificado recién
emitido. El hash genera una firma única del certificado de forma que
en cualquier momento podemos
verificar
su integridad. La CA anterior, a su vez, tendrá otro certificado emitido
por una CA superior, hasta que llegaremos a una CA cuya identidad será
conocida por toda la comunidad. No obstante, con algunos conocimientos de
openssl podemos tomar el papel
de una CA y generar nuestros propios certificados; de esta forma podemos tener
comunicación segura con un conjunto de gente sin tener contanto con
ninguna CA oficial. Cuando un certificado haya sido generado por una CA no
conocida, el navegador nos avisará de ello y nos preguntará
si confiamos en ella.
NOTA: Al pedir un certificado a una CA, deberíamos enviarle
nuestra llave pública, para que sea ésta la que se incluye en
el certificado. Si no lo hacemos (o si lo hacemos, pero la CA la ignora) generará
el par de llaves, pública y privada, y por lo tanto será capaz
de descifrar toda nuestra comunicación.
El estándar X509.
Los certificados vienen definidos en el estándar X509, el cual
se describen, entre otros, los PKCS7, PKCS10 y PKCS12:
- PKCS7: Este estándar es el que describe como enviar
correos cifrados y/o firmados, bien con certificados o bien con un resumen
para asegrar la integridad del mensaje.
- PKCS10, Certificate Request o petición de certificado.
Es el utilizado para pedir un certificado. Consiste en la llave pública
y la identidad de quien pide el certificado. Aparte tiene muchos más
campos que se pueden rellenar de fomra opcional y amplian la información
del que será dueño del certificado.
- PKCS12. En este estándar viene definida la sintaxis
para el intercambio de certificados. Lógicamente son los archivos
.p12 que se instalan en los ejemplos de instalación de certificados.
Cuando lo hemos instalado y se usa correctamente, podemos enviar correos
firmados todos aquellos que tengan nuestra llave pública y correos
cifrados a aquellos cuya clave pública esté en nuestro almacén.
Para eso debe haber un intercambio de claves, que se realiza la primera vez
que enviamos un correo firmado.