0. Introducción |
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
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:
1. Definiciones |
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:
En este capitulos se expondran diversos ejemplos practicos de cosas que se pueden hacer con la aplicacion opessl.
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
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:
Un ejemplo de utilizacion con la aplicacion openssl seria:
$ openssl md5 texto.txt
MD5(texto.txt)= 3f8a62a7db3b276342d4c65dba2a5adf
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
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:
¿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.
$SSLEAY CONFIG
: variable que almacena la opcion del
fichero de configuracion $CATOP
: variable que almacena el directorio destino
(por defecto ./demoCA
) 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.
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:
$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
$openssl ca -config openssl.cnf -in cliente.pem -out c firmado.pem
$openssl s client -CApath CA -cert c firmado.pem
-key ckey.pem
$openssl s server -CApath CA -cert s firmado.pem
-key skey.pem -debug
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
Podemos obtener informacion en forma de texto plano de un determinado certificado.
$ openssl x509 -in certificado.pem -noout -text
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