Introducción básica al SSL

Generación de certificados para la navegación segura usando OpenSSL


Introducción || Definiciones || Trabajando con OpenSSL

0. Introducción

Características del SSL
Protocolo SSL

Indice


0.1 Características del SSL

El SSL es un protocolo seguro de Internet inventado por la empresa Netscape. Sirve para cualquier comunicación vía Internet, y por lo tanto, para las transacciones económicas realizadas en el comercio electrónico.

Sustituye los sockets del sistema operativo. Los sockets son el interficie entre las aplicaciones y el protocolo TCP/IP del sistema operativo. De este modo puede servir para cualquier aplicación que utilice TCP/IP: Mail, Webs, FTP, news, etc..., aunque las aplicaciones de los programas actuales solo permites HTTP (Webs).

Para diferenciar las páginas dentro de una zona de servidor SSL, se utiliza la denominación https y se conecta mediante el puerto 443.

El SSL puede realizar las siguientes funciones:

Se utilizan certificados X509v3 para la transmisión de las claves públicas. En la sección Trabajando con OpenSSL veremos como generar certificados para establecer comunicaciones seguras

Subir

0.2 Protocolo SSL

El protocolo SSL se divide en dos capas complementarias:

El protocolo SSL se comporta como una máquina de estados, durante el intercambio de información siempre hay un estado de escritura activo y otro pendiente y un estado de lectura activo y otro pendiente. Para cambiar del estado activo al pendiente se utiliza un subprotocolo del Handshake llamado Change Cypher Spec.

Entre dos entidades cliente y servidor se pueden abrir varias sesiones SSL, aunque no es habitual, y dentro de cada sesión se pueden mantener varias conexiones SSL. Las conexiones se abren o cierran a través del protocolo de Handshake.

Un estado de sesión incluye los siguientes elementos:

Un estado de conexión incluye los siguientes elementos:

Subir


1. Definiciones

OpenSSL

Indice


1.1 OpenSSL

OpenSSL es una kit de herramientas criptográficas que implementan las versiones 2 y 3 de Secure Socket Layer (SSL) y la version 1 de los protocolos de red de Transport Layer Security (TSL) junto con los estandares criptograficos que requieren.
El programa openssl es una aplicacion de linea de comandos para poder utilizar numerosas funciones criptograficas de la libreria criptografica OpenSSL desde la shell. Se puede utilizar para:

Subir


2. Trabajando con OpenSSL

Cifrando con algoritmos simetricos (DES)
Resumen de un Mensaje (MD5)
Algoritmos Asimetricos
Creacion de un Autoridad de Certificacion
Generacion y firmas de certificados
Protocolo SSL
Certificando para un Servidor Seguro
Visualizacion de certificados
Exportar cetificados para Netscape

Indice


En este capitulos se expondran diversos ejemplos practicos de cosas que se pueden hacer con la aplicacion opessl.

2.1 Cifrando con algoritmos simetricos (DES)

La criptografia simetrica (tambien conocida como de clave privada) se refiere al conjunto de metodos que permiten tener comunicacion segura entre las partes siempre y cuando anteriormente se hayan intercambiado la clave. La simetría se refiere a que las partes tienen la misma llave tanto para cifrar como para descifrar.
El sistema criptografico simetrico mas conocido es el DES que consiste esencialmente en aplicar un numero finito de interacciones de cierta forma, que finalmente da como resultado el mensaje cifrado.

$ openssl des -in <entrada> -out <salida.des>

En la actualidad no se ha podido romper el sistema DES desde la perspectiva de poder deducir la clave simetrica a partir de la informacion interceptada, sin embargo con un metodo a fuerza bruta, es decir probando alrededor de 256 posibles claves, se pudo romper DES en Enero de 1999. La opcion que se ha tomado al respecto con la finalidad de dar mayor fortaleza a DES ha sido usar lo que se conoce como cifrado multiple, es decir aplicar varias veces el mismo algoritmo para fortalecer la longitud de la clave, esto a tomado la forma de un nuevo sistema de cifrado que se conoce actualmente como triple-DES o TDES.

$ openssl des3 -in <entrada> -out <salida.des3>

A la hora de realizar la descompresion la llamada seria

$ openssl des -in <salida.des3> -out <texto.txt>

Ejemplo

$ openssl des -d -in cifrado.des -out recupera.txt
enter des-cbc decryption password: 1234

de esta forma obtendriamos de nuevo el texto en claro.

Ademas de los algoritmos DES y Triple DES, openssl proporciona los siguientes
algoritmos simetricos:

base64 , bf , bf-cbc , bf-cfb , bf-ecb , bf -ofb , cast , cast-cbc , cast5-cbc , cast5-cfb , cast5-ecb , cast5-ofb
des-cbc , des-cfb , des-ecb , des-ede , des-ede-cbc , des-ede-cfb , des-ede-ofb , des-ede3 , des-ede3-cbc
des-ede3-cfb , des-ede3-ofb , des-ofb , desx , idea , idea-cbc , idea-cfb , idea-ecb , idea-ofb , rc2 , rc2-40-cbc
rc2-64-cbc , rc2-cbc , rc2-cfb , rc2-ecb , rc2-ofb , rc4 , rc4-40 , rc5 , rc5-cbc , rc5-cfb , rc5-ecb , rc5-ofb

Subir

2.2 Resumen de un Mensaje (MD5)

Una herramienta fundamental en la cripotografia, son las funciones hash, son usadas principalmente para resolver el problema de la integridad de los me nsajes, asi como la autenticidad de mensajes y de su origen. Una funcion hash es tambien ampliamente usada para firma digital, ya que los documentos a firmar son en general demasiado grandes, la funcion hash les asocia una cadena de longitud 160 bits que los hace mas manejables para el proposito de firma digital (independientemente de la longitud del fichero genera una secuencia unica de 160 bits que lo identifica).
MD5 se puede usar para resolver el problema de la integridad de la informacion, al mensaje se le aplica un MD5 (una funcion hash) y se manda junto con el propio mensaje, al recibirlo el receptor aplica la funcion hash al mensaje y comprueba que sea igual al hash que se envio antes. Es decir, se aplica un hash al mensaje M y se envia con el mensaje (M, h(M)), cuando se recibe se le aplica una vez mas el hash (ya que M es publico) obteniendo h(M), si h(M)=h(M), entonces se acepta que el mensaje se a transmitido sin alteracion.

Las propiedades que deben de tener las primitivas hash son:

  1. Resistencia a la preimagen: significa que dada cualquier imagen, es computacionalmente imposible encontrar un mensaje x tal que h(x)=y. Otra forma como se conoce esta propiedad es que h sea de un solo sentido.
  2. Resistencia a una 2 ffi preimagen: significa que dado x, es computacionalmente imposible encontrar una x tal que h(x)=h(x). Otra forma de conocer esta propiedad es que h sea resistente a una colision suave.
  3. Resistencia a colision: significa que es computacionalmente imposible encontrar dos diferentes mensajes x, x tal que h(x)=h(x). Esta propiedad tambien se conoce como resistencia a colision fuerte.

Un ejemplo de utilizacion con la aplicacion openssl seria:

$ openssl md5 texto.txt
MD5(texto.txt)= 3f8a62a7db3b276342d4c65dba2a5adf

Subir

2.3 Algoritmos Asimetricos

Los algoritmos de clave publica, o algoritmos asimetricos, han demostrado su interes para ser empleados en redes de comunicacion inseguras (Internet). Introducidos por Diffie y Hellman a mediados de los 70, su novedad fundamental con respecto a la criptografia clasica simetrica es que las claves no son unicas, sino que forman pares.
Los algoritmos asimetricos emplean generalmente longitudes de clave mucho mayores que los simetricos. Por ejemplo, mientras que para algoritmos simetricos se considera segura una clave de 128 bits, para algoritmos asimetricos se recomiendan al menos 1024 bits; haciendolos de esta forma mas lentos. En la practica los metodos asimetricos se emplean unicamente para codificar la clave de sesion (simetrica) de cada mensaje. Los algoritmos asimetricos como se ha comentado antes poseen dos claves diferentes en lugar de una, Kp y KP, denominadas clave pricada y clave publica. Una de ellas se emplea para codificar, mientras que la otra se usa para decodificar. El mas conocido de estos algoritmos es el RSA ( Rivest Shamir y Adleman ) su funcionamiento esta basado en la imposibilidad computacional de factorizar numeros enteros grandes.

* Generando una clave privada RSA

$ openssl genrsa -out clave privada.rsa 1024

ahora la clave la cifro ademas con des (cambia la cabecera fijate)

$ openssl genrsa -out clave privdes.rsa -des 1024

* Generando clave publica a partir de la privada

$ openssl rsa -in clave privada.rsa -pubout -out clave publica.rsa

Un hecho muy habitual es querer quitar la frase de acceso a la clave RSA. ¿Cuando? Por ejemplo si tenemos un servidor apache seguro que queremos lanzar desde el arranque y la llave privada del servidor precisa que metamos una frasecilla

$ ./programa
Enter PEM pass phrase:

¿Como acabar con esto?

$ openssl rsa -in confrase.key -out sinfrase.key read RSA key
Enter PEM pass phrase:
writing RSA key

Subir

2.4 Creacion de un Autoridad de Certificacion

Es necesaria la figura de una autoridad de certificacion (CA) cuyo papel sera el de firmar los certificados digitales de los usuario, generar los certificados, mantener el estado correcto de los certificados. Resulta muy comun que estas autoridades se organicen de forma jerarquica.
El mecanismo de actuacion de estas CAs sera el siguiente:

  1. La generacion del certificado se hace primero por una solicitud de un usuario, el usuario genera sus claves publica y privada y manda junto con los requerimientos de la solicitud su clave publica para que esta sea certificada por la AC
  2. Una vez que la AR (es la AC regional) verifica la autenticidad del usuario, la AC via la AR firma el certificado digital y es mandado al usuario
  3. El status del usuario puede estar en: activo, inactivo o revocado. Si es activo el usuario puede hacer uso del certificado digital durante todo su periodo valido
  4. Cuando termina el periodo de activacion del certificado el usuario puede solicitar su renovacion.

¿Como creamos una autoridad de certificacion con OpenSSL?

La operacion se puede realizar de una forma muy sencilla por medio de un script en Perl que viene con la distribucion de openSSL, llamado CA.pl. Ejecutando:

$ CA.pl -newca

crearemos una autoridad de certificacion (dentro de un directorio llamado ./demoCA)

El script es facilmente modificable para que tome otro fichero de configuracion y para que almacene los resultados en un nuevo directorio.

Subir

2.5 Generacion y firmas de certificados

Cual usuario de la aplicacion openSSL puede crear su propio certificado identificativo y su clave privada

$openssl req -newkey rsa:1024 -keyout privada.pem -out peticion.pem -config ./openssl.cnf

Despues sera la autoridad de certficicacion la que firme esa peticion dandole de esta forma validez. Asi, un tercer usuario que se fie de esta CA, podra saber que el usuario de ese determinado certificado es quien dice ser, ya que la CA de la que fia lo corrobora. Una CA firma un determinado certificado y genera uno nuevo firmado por el, de la siguiente forma:

$openssl ca -in peticion.pem -out firmado.pem -config ./myconfig
Using configuration from myconfig.cnf
Enter PEM pass phrase:
Check that the request matches the signature
Signature ok
The Subjects Distinguished Name is as follows
countryName :PRINTABLE:ES
stateOrProvinceName :PRINTABLE:Castellón
localityName :PRINTABLE:Castellón
organizationName :PRINTABLE:Universidad Jaume I
organizationalUnitName:T61STRING:ITIG
commonName :PRINTABLE:Arcano NISU (Cliente)
emailAddress :IA5STRING:Arcano@nisu.org
Certificate is to be certified until May 3 09:17:13 2001 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

De esta forma dentro del directorio donde se encuentra la informacion de la autoridad de certificacion (Autoridad) en este caso, se actualiza el indice (fichero index.html) y se incluye una copia del certificado firmado en el subdirectorio newcerts.

Subir

2.6 Protocolo SSL

El protocolo SSL (Secure Socket Layer) permite establecer conexiones seguras a traves de Internet, de forma sencilla y transparente. La idea consiste en interponer una fase de codificacion de mensajes antes de enviarlos por la red. Una comunicacion SSL consta fundamentalmente de dos fases:

La aplicacion openssl nos brinda la posibilidad de realizar una comunicacion SSL entre dos interlocutores, para ello se debera:

  1. Generar la autoridad de certificacion CA [2.4]
  2. Generar los request y las claves privadas tanto para cliente como para el servidor

$openssl req -newkey rsa:1024 -keyout ckey.pem -out cliente.pem -config ./openssl.cnf

Suponemos que hemos modificado el fichero openssl y que esta en el directorio actual

  1. Firmarlos por la autoridad de CA

$openssl ca -config openssl.cnf -in cliente.pem -out c firmado.pem

  1. Arrancar los servicios Cliente

    $openssl s client -CApath CA -cert c firmado.pem -key ckey.pem

  2. Arrancar los servicios Servidor

    $openssl s server -CApath CA -cert s firmado.pem -key skey.pem -debug

Subir

2.7 Certificando para un Servidor Seguro

Creamos un certificado y lo firmamos con nuestra autoridad de Certificacion

$ openssl req -new -days 365 -newkey rsa:1024 -keyout netkey.pem -out netscape.out -config myconfig.cnf
$ openssl ca -config myconfig.cnf -out netscape.pem -infiles netscape.out

Copiamos el certificado firmado y la llave en el lugar adecuado dentro de la jerarquia de directorios de servidor Web.
En el fichero de configuracion de servidor apache (http.conf) encontramos 2 lineas donde se indica el nombre y el lugar donde se encuentra el certificado y la clave privada.

SSLCertificateFile /home/nacho/apache-1.3.12/conf/ssl.crt/servidor.crt
SSLCertificateKeyFile /home/nacho/apache-1.3.12/conf/ssl.key/servidor.key

En este caso tendriamos que copiar los ficheros y cambiarlos de nombre

$ cp netkey.pem /home/nacho/apache-1.3.12/conf/ssl.key/servidor.key
$ cp netscape.pem /home/nacho/apache-1.3.12/conf/ssl.crt/servidor.crt

Para que el Netscape entienda bien el certificado firmado sera necesario editarlo y recortar la lineas de informacion para asi dejar unicamente

-----BEGIN CERTIFICATE-----
MIID4jCCA0ugAwIBAgIBAjANBgkqhkiG9w0BAQQFADCBqDELMAkGA1UEBhMCRVMx
....
j7HRLuw9VTUcaEZ71RCYkA1JSlFEPLKgTWW77aZr5GMkGYPVNwA=
-----END CERTIFICATE-----

Por ultimo arrancamos el servidor Web

$ apachectl startssl

Subir

2.8 Visualizacion de certificados

Podemos obtener informacion en forma de texto plano de un determinado certificado.

$ openssl x509 -in certificado.pem -noout -text

Subir

2.9 Exportar cetificados para Netscape

Netscape importa certificados #PKCS12 por lo que necesitaremos realizar una conversion a este tipo de formato.

$ openssl pkcs12 -export -in certificado.sign -inkey clave.key -out certificado.p12 -name Certificado de XXX

Subir