OpenSSL en script de Bash

Publicado: marzo 11, 2013 en criptología, Linux, Seguridad de la información, seguridad inform'atica
Hoy les comentaré de OpenSSL que es una herramienta muy flexible, que proporciona muchos módulos cada uno de los cuales realiza una tarea específica. Cada módulo no es un ejecutable separado sin embargo se selecciona con el primer parámetro del ejecutable openssl. Por otro lado ,cada módulo tiene una página de manual separada. Por ejemplo, un modulo llamado x509 gestiona certificados digitales X509 y un mdulo llamado pkcs12 gestiona paquetes PKCS12. Para ejecutar x509, ejecutamos lo siguiente:
openssl x509 -param1 param1 valor
pero para ver su manual debemos escribir : man x509
Probando Conexiones SSL/TLS (Secure Socker Layer/Transport Layer Security)
Openssl posee 3 módulos que nos permite probar conexiones SSL:
s_client (simula un cliente), útil para probar que protocolos y que cifrados está de acuerdo en utilizar el    servidor, siendo útil en seguridad y en auditorias de funcionalidad.
s_server (simula un servidor)
s_time  (pruebas de tiempo de conexión)
Para comprobar que protocolos acepta server podemos utilizar los siguientes parámetros: -ssl2, -ssl3, -tls1, -no_ssl2, -no_ssl3, o -no_tls1.
Dado que se sabe que ssl2 tiene debilidades en seguridad podemos conectar con el servidor utilizando la orden siguiente:
openssl s_client -connect server:443 -no_ssl3 -no_tls1
Si el servidor acepta cualquier protocolo distinto de SSL3 o TLS1, la orden anterior abre una conexión y espera los datos.
Para cerrar la conexión inmediatamente después de haberla establecido, escribimos en s_client:
echo “x” | openssl s_client -connect server:443 -no_ssl3 -no_tls1
con -cipher comprobamos los parámetros permitidos. Podemos buscar nombres de grupos y cifrados con man ciphers.
Para comprobar si el servidor acepta conexiones usando cifrados de un grupo NULL o LOW :
echo “x” | openssl s_client -connect $server:443 -cipher NULL,LOW
Para comprobar si se puede establecer una conexión SSL2 sin esperar más de 10 segundos, podemos utilizar:
echo “x” | timeout openssl s_client -connect server:443 -ssl2
Para automatizar más la orden podemos utilizar $? para comprobar el retorno de la última orden ejecutada  por Bash. Si se ha establecido la conexión, OpenSSL devuelve 0. 
El siguiente script lee nombre de anfitrión desde la salida estándar y comprueba si se establece otra conexión distinta de SSL3 o TLS1 en el puerto 443. Espera 3 segundos. Los anfitriones que permiten este tipo de conexión se escriben en un archivo bad_protocol.txt. Los anfitriones que permiten conexiones con cifrados NULL o LOW se listan en bad_cipher.txt.
01 #!/bin/bash
02 while read server ; do
03    timeout 3 openssl s_client -connect $server:443 -no_ssl3 -no_tls1
04    if [ $? -eq 0]; then
05       echo $server >> bad_protocol.txt
06    fi
07    timeout 3 openssl s_client -connect $server:443 -cipher NULL.LOW
08    if [ $? -eq 0]; then
09       echo $server >> bad_cipher.txt 
10    fi
11 done
 Manejar Formatos PEM/DER y PKCS12
 Para convertir archivos en formatos PEM y DER podemos usar los parámetros -inform y outform. Por ejemplo para convertir todos los certificados X.509 de PEM a DER, usaremos el siguiente bucle:
for file in*.pem;
do openssl x509 -inform PEM -in $file -outform DER -out $file.der; 
done
Otra tarea común es extraer claves/certificados de un paquete PKCS12, que normalmente esta protegido con una contraseña.
Para extraer los certificados de los archivos PKCS12 protegidos con contraseña en un directorio de trabajo y almacenarlos en un directorio de trabajo y almacenarlos sin proteccion de contraseña, se hace lo siguiente:
for file in*.p12;
do openssl pkcs12 -in $file -passin file: $file.pass -nokeys -nodes -out $file.nokeys; 
done
Asumiendo que tenemos la contraseña para cada archivo PKCS12 con la extension .pass 
Cifrado y Descifrado en Masa
Para cifrar un archivo plain.txt de manera simétrica y escribir la salida en cipher.enc, podemos usar la siguiente orden:
openssl  [ ciphername] -a -salt -in plain.txt -out cipher.enc
 
En consecuencia para cifrar todos los archivos .txt en el directorio actual y escribirlo en el directorio ../enc con la cifra aes-256-cbc, podemos utilizar el siguiente bucle (asumiendo que se escribe la contraseña del archivo pass):
 
for file in*.txt;
do openssl aes-256-cbca -salt -in “$file” -out “../enc/$file” passin file:pass; 
done
 
Podemos descifrar todos los archivos .txt en el directorio actual y escribirles en el directorio ../dec con :
 
for file in*.txt;
do openssl aes-256-cbc-d –a -salt -in “$file” -out “../dec/$file” passin file:pass; 
done
 
asumiendo nuevamente que tenemos una contraseña en el archivo pass.
                                                                                       
fuente:  Marcin Teodorczyk
 
Anuncios

Los comentarios están cerrados.