Diferencia entre revisiones de «Página principal»

De HowTo OpenSSL
Ir a la navegación Ir a la búsqueda
m (→‎AES - 192 - CFB: cambio menor)
 
(No se muestran 6 ediciones intermedias del mismo usuario)
Línea 199: Línea 199:
  
 
'''''dgst'''''
 
'''''dgst'''''
 +
 +
A continuación se muestran las opciones más habituales de este comando, que debe ser consultado en la documentación de OpenSSL (https://www.openssl.org/docs/man1.1.1/man1/dgst.html)
  
 
; -digest
 
; -digest
Línea 215: Línea 217:
  
 
Firma el resumen usando la clave privada en "filename"
 
Firma el resumen usando la clave privada en "filename"
 +
 +
; -keyform arg
 +
 +
Especifica el formato de la clave (pública o privada) en "arg", que será PEM (por defecto), DER, P12, ó ENGINE.
  
 
; -verify filename
 
; -verify filename
  
Verifica la firma usando la clave pública en "filename". En la salida puede salir: "Verification OK" o "Verification Failure".
+
Verifica la firma usando la clave pública en "filename". El resultado será: "Verification OK" o "Verification Failure".
  
 
; -signature filename
 
; -signature filename
Línea 792: Línea 798:
 
Para descifrar se haría de la misma manera que en el paso 1, colocando la opción "-d" y permutando los valores de las opciones "-in" y "-out".
 
Para descifrar se haría de la misma manera que en el paso 1, colocando la opción "-d" y permutando los valores de las opciones "-in" y "-out".
  
===== AES - 256 - OFB =====
+
===== AES - 256 - CTR =====
  
En este ejemplo usaremos AES de 256 bits para cifrar con modo OFB, lo que resultará en un cifrado de flujo.  
+
En este ejemplo usaremos AES de 256 bits para cifrar con modo CTR, lo que resultará en un cifrado de flujo.  
  
 
;Paso 1:
 
;Paso 1:
 
Cifraremos el fichero ''texto.txt'' usando ''-pass: file:filename''. El ''filename'' corresponde con el archivo que contiene la contraseña, en este ejemplo el fichero se llamará "passwd.txt". Además, se introducirá la opción "-pbkdf2" para emplear la derivación de clave más potente.
 
Cifraremos el fichero ''texto.txt'' usando ''-pass: file:filename''. El ''filename'' corresponde con el archivo que contiene la contraseña, en este ejemplo el fichero se llamará "passwd.txt". Además, se introducirá la opción "-pbkdf2" para emplear la derivación de clave más potente.
  
<code> openssl enc -aes-256-ofb -a -pbkdf2 -pass file:passwd.txt -in texto.txt -out aes_256_ofb.cif </code>
+
<code> openssl enc -aes-256-ctr -a -pbkdf2 -pass file:passwd.txt -in texto.txt -out aes_256_ctr.cif </code>
  
 
;Paso 2:
 
;Paso 2:
 
Para verificar que se ha cifrado el fichero correctamente se muestra el contenido del fichero de salida por la terminal:
 
Para verificar que se ha cifrado el fichero correctamente se muestra el contenido del fichero de salida por la terminal:
  
<code> cat aes_256_ofb.cif  </code>
+
<code> cat aes_256_ctr.cif  </code>
  
 
<pre>  
 
<pre>  
Línea 814: Línea 820:
 
Para descifrar, podemos ejecutar el siguiente comando (que no tiene la opción -pass file:passwd.txt) y posteriormente introducimos la contraseña contenida en dicho fichero:
 
Para descifrar, podemos ejecutar el siguiente comando (que no tiene la opción -pass file:passwd.txt) y posteriormente introducimos la contraseña contenida en dicho fichero:
  
<code> openssl enc -aes-256-ofb -d -a -pbkdf2 -in aes_256_ofb.cif -out texto_des.txt</code>
+
<code> openssl enc -aes-256-ctr -d -a -pbkdf2 -in aes_256_ctr.cif -out texto_des.txt</code>
  
 
<pre>
 
<pre>
enter aes-256-ofb decryption password:
+
enter aes-256-ctr decryption password:
 
</pre>
 
</pre>
  
Línea 1707: Línea 1713:
  
 
<code>cmp secreto1 secreto2</code>
 
<code>cmp secreto1 secreto2</code>
 +
 +
==== Secretos DH y EC como generadores de claves simétricas - Generadores de "carraca" (ratchet) y Forward Secrecy ====
 +
 +
Obsérvese que el "secreto" que se ha negociado con las dos parejas de claves DH es un valor binario de 256 caracteres (2048 bits), mientras que el secreto derivado de las claves X25519 tiene tan sólo 32 caracteres binarios (256 bits), ya que las claves EC (de curva elíptica) son de menor tamaño que las originales DH y por tanto, los números que resultan de las operaciones de derivación son de tamaño similar a las claves utilizadas.
 +
 +
Habitualmente, este secreto será empleado como generador de clave (y vector de inicialización, en su caso) del algoritmo de cifrado simétrico escogido entre ambas partes. Es común, sobre todo empleando curvas elípticas, que se necesiten más bits para la clave de cifrado simétrico (y vector) que el tamaño del propio secreto obtenido, pero esto no es problema, ya que el secreto no se usa directamente como valor de la clave. Lo que se hace es calcular un resumen determinado (sha-256, sha-512, etc.) del secreto y generar a partir de este resumen, directamente o por iteración de la función (realimentando la salida en la entrada tantas veces como se necesite) los bits necesarios para rellenar la clave (y el vector).
 +
 +
Una variante de este proceso bastante común en la actualidad es el empleo del secreto como "generador de carraca" o "ratchet function". En este caso, lo que se introduce en la función de resumen es la concatenación del secreto y un contador, lo que permitirá cambiar la clave (y el vector) en cada transmisión (identificada por su número en el contador siempre creciente), tal y como se hace en los mensajes de la conocida aplicación Whatsapp. Este tipo de generación de claves en secuencia garantiza la propiedad conocida como "Forward Secrecy", ya que el descifrado de cada mensaje requerirá el mismo esfuerzo para el atacante, dado que si no conoce el valor del secreto negociado, no podrá deducir la secuencia de claves que se aplica en cada mensaje.
  
 
== S/MIME ==
 
== S/MIME ==
Línea 1996: Línea 2010:
 
En un lugar de la Mancha de cuyo nombre no quiero acordarme...
 
En un lugar de la Mancha de cuyo nombre no quiero acordarme...
 
</pre>
 
</pre>
 +
 +
Obsérvese que no se ha incorporado en el comando de verificación el certificado del firmante (emisor del correo), ya que habitualmente los agentes de correo como Thunderbird incorporan como adjunto el certificado del firmante (emisor) en todos los mensajes firmados, como opción por defecto. De no ser así, el comando informaría de error en la verificación por falta de un certificado y sería necesario incorporar el certificado del firmante, con la opción "-certfile CertEmisor.pem" o similar.
  
 
== Generación y verificación de certificados X.509 ==
 
== Generación y verificación de certificados X.509 ==

Revisión actual del 19:28 26 feb 2025

Esta página consiste en un manual de operaciones básicas en formato HowTo sobre Wiki de la herramienta OpenSSL en modo de comandos relativos con el cifrado de ficheros, la generación y manipulación de claves simétricas, certificados digitales, correo electrónico seguro, etc. Además, se combinarán diferentes ejemplos prácticos de los comandos más relevantes de OpenSSL haciendo un estudio y análisis de cada caso.

Para ello, se ofrecerá una guía para INSTALAR la última versión de OpenSSL que corresponde con la 1.1.1 y así, poder desarrollar ejemplos prácticos con la última versión mejorada de esta herramienta.

Sumario

Instalación OpenSSL

WINDOWS

Para la instalación de OpenSSL en Windows, se debe de realizar correctamente los pasos que se describen a continuación. Además, al instalar OpenSSL puede que el sistema requiera usar Microsoft Visual C++ (Descarga).

Paso 1

Se procede a descargar la última versión de OpenSSL, la cuál podemos encontrar en la página de slproweb. Según el caso, se elige el SO de 32 o 64 bits.

Paso 2

Se ejecuta el archivo.exe descargado y se mantiene la configuración que aparece por defecto excepto, cuando pida copiar OpenSSL que se seleccionará la opción: The OpenSSL binaries (/bin) directory.

Paso 3;

1) En el buscador de Windows se escribe los siguiente: sysdm.cpl para abrir las Propiedades del Sistema.

2) Opciones Avanzadas.

3) Variables de Entorno.

4) En variables del sistema, se selecciona Path y editar.

5) Nuevo.

6) Escribir C:\Program Files\OpenSSL-Win64.

7) Aceptar.

8) Seleccionar de nuevo Path y editar.

9) Nuevo.

10) Escribir C:\Program Files\OpenSSL-Win64\bin

11) Aceptar.

12) En variables de usuario, se selecciona nueva.

13) En el nombre de la variable se pone lo siguiente: OPENSSL_CONF.

14) En el valor de la variable se pone lo siguiente: C:\Program Files\OpenSSL-Win64\bin\cnf.

15) Aceptar.

Paso 6

En la terminal se escribe openssl y tiene que salir lo siguiente:


OpenSSL>

Esto significa que está listo para su uso.

Nota: Puede que al instalar la herramienta OpenSSL para equipos de 32 bits, los directorios cambien.

Ubuntu y CentOS

En este apartado se explica como instalar manualmente la última versión de OpenSSL en una distribución Ubuntu o CentOS

Nota:Muchas distribuciones de CentOS y Ubuntu ya tienen instalada una versión de OpenSSL que suele ser anterior a la última. Además, la versión instalada es utilizada por varios componentes del sistema operativo. Por ello, mostramos como instalar la última versión sin afectar a la ya instalada en el sistema, que seguirá igual que antes de la instalación. Es decir, después de estas operaciones, el sistema seguirá utilizando las librerías OpenSSL de la versión antigua en todas sus aplicaciones (httpd, etc.) pero los usuarios dispondrán de los comandos "openssl" y "c_rehash" de la nueva versión.

Antes de empezar

Tenemos que estar seguros de que el sistema está actualizado y que tiene instalado el compilador gcc y sus librerías, la utilidad "make", librerías de desarrollo,etc.

En Centos:

sudo yum update -y

sudo yum group install 'Development Tools'

sudo yum install perl-core zlib-devel -y

En Ubuntu:

sudo apt-get update && sudo apt-get upgrade

sudo apt install build-essential checkinstall zlib1g-dev -y

Paso 1

Averiguar cuál es y descargar la última versión de OpenSSL:

Para averiguar cuál es la última versión de OpenSSL hay que acceder a https://www.openssl.org/source y apuntar el nombre del fichero en la primera línea de la tabla de descargas

A fecha de la última actualización de esta Wiki la versión disponible es la openssl-1.1.1e.tar.gz y esta es la que usaremos en este ejemplo.

cd /tmp

wget https://www.openssl.org/source/openssl-1.1.1e.tar.gz

tar xvf openssl-1.1.1e.tar.gz

Paso 2

A continuación, ejecutamos los siguientes comandos para realizar la instalación de esta herramienta: Accedemos al directorio de los fuentes de OpenSSL:

cd openssl-1.1.1e

Configuramos el directorio de destino:

sudo ./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared zlib

Compilamos, probamos e instalamos:

sudo make

Empieza la compilación de todas las fuentes... tarda varios minutos

sudo make test

Se ejecutan los tests de binarios y librerias ... tarda varios minutos

Y si todo ha ido bien...

sudo make install

Se instalan los binarios y las librerías bajo el directorio /usr/local/ssl

Paso 3

Activar las librerías de la nueva versión, para ello hay que crear el fichero /etc/ld.so.conf.d/openssl-1.1.1e.conf con "/usr/local/ssl/lib" como contenido:

sudo echo "/usr/local/ssl/lib" > /etc/ld.so.conf.d/openssl-1.1.1e.conf

El siguiente comando fuerza la recarga de las librerías y con ella se activa la nuestra:

sudo ldconfig -v

Paso 4

Añadir /usr/local/ssl/bin al principio de la variable de entorno PATH, esto hará que el comando openssl se busque antes en el directorio de nuestra instalación que en el ya existente (típicamente /usr/bin). Esto se puede hacer para nuestro usuario o para todos los usuarios:

a) Para todos los usuarios del sistema: la manera más sencilla tanto en CentOS como en Ubuntu es:

sudo echo "PATH=/usr/local/ssl:\$PATH" >> /etc/profile

b) Sólo para nuestro usuario, en este caso será distinto si tenemos CentOS o Ubuntu ya que el primero típicamente usa ~/.bash_profile y el segundo ~/.profile

en Centos :

sudo echo "PATH=/usr/local/ssl/bin:\$PATH ; export PATH" >> ~/.bash_profile

en Ubuntu :

sudo echo "PATH=/usr/local/ssl/bin:\$PATH" >> ~/.profile

Paso 5

Salir de la sesión, volver a entrar y probar que funciona con

openssl version

Y debe aparecer la versión instalada.

MAC OS

En este apartado se explica como instalar la última versión de OpenSSL usando un gestor de paquetes para facilitar la instalación en este tipo de SO. En este caso, se usará el gestor de paquetes brew.

Paso 1

Instalamos la última versión de OpenSSL de la siguiente manera:

1) brew install openssl@1.1

Paso 2

Si en el equipo donde se va realizar la operación no tiene instalada ninguna versión de esta herramienta, bastaría con ejecutar el paso anterior. Si no es así, se debe ejecutar los comandos que se recomiendan en el proceso de instalación y de esta forma, se dará prioridad a la nueva versión instalada.


If you need to have openssl@1.1 first in your PATH run:
  
  echo 'export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"' >> ~/.bash_profile

For compilers to find openssl@1.1 you may need to set:

  export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib"
  export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include"

Paso 3

Se reinicia el equipo.

Resúmenes

Funciones de resumen o funciones "hash"

Hash function2-es.svg

A las funciones de resumen también se les llama funciones hash o funciones digest. Las funciones hash criptográficas [1] son aquellas que aceptan cualquier entrada y producen una salida consistente en una ristra de bits de tamaño fijo, que representa un "resumen" de toda la información del fichero de entrada. [2] Uno de los requisitos de estas funciones es que debe ser complejo encontrar colisiones, es decir, debe ser complejo encontrar dos mensajes distintos con el mismo resumen. [3]

Se llaman funciones hash criptográficas a aquellas funciones hash que se utilizan en el área de la criptografía. Este tipo de funciones se caracterizan por cumplir propiedades (mezcla fuerte, dificultad de encontrar colisiones, etc.) que las hacen idóneas para su uso en sistemas que confían en la criptografía para dotarse de seguridad, garantizando que no se ha modificado un archivo en una transmisión, hacer ilegible una contraseña, firmar digitalmente un documento, protección de claves, etc. Estas propiedades las hacen resistentes frente ataques maliciosos que intentan romper esa seguridad.[4]

dgst

A continuación se muestran las opciones más habituales de este comando, que debe ser consultado en la documentación de OpenSSL (https://www.openssl.org/docs/man1.1.1/man1/dgst.html)

-digest

Especifica el nombre de la función de resumen utilizada.

-binary

Salida en forma binaria.

-out filename

Nombre del archivo de salida.

-sign filename

Firma el resumen usando la clave privada en "filename"

-keyform arg

Especifica el formato de la clave (pública o privada) en "arg", que será PEM (por defecto), DER, P12, ó ENGINE.

-verify filename

Verifica la firma usando la clave pública en "filename". El resultado será: "Verification OK" o "Verification Failure".

-signature filename

Se introduce la firma a verificar en "filename".

-hmac key

Crea un hash MAC usando "key" como clave.


A continuación, se realizarán ejemplos con las funciones de resúmenes más importantes:

MD5

MD5 es uno de los algoritmos de reducción criptográficos diseñados por el profesor Ronald Rivest del MIT (Massachusetts Institute of Technology, Instituto Tecnológico de Massachusetts). Fue desarrollado en 1991 como reemplazo del algoritmo MD4 después de que Hans Dobbertin descubriese su debilidad. Se trata de un algoritmo de reducción criptográfico de 128 bits (32 caracteres hexadecimales) ampliamente usado. Uno de sus usos es el de comprobar que algún archivo no haya sido modificado. A pesar de su amplia difusión actual, la sucesión de problemas de seguridad detectados desde que, en 1996, Hans Dobbertin anunciase una colisión de hash, plantea una serie de dudas acerca de su uso futuro. [5] Cabe destacar, que existe algoritmos anteriores pertenecientes a la familia MD5 como fueron MD1, MD2, MD3 y MD4. Aunque MD5 esté en desuso por sus vulnerabilidades (se considera "roto" actualmente), se debe conocer como funciona, ya que existe multitud de documentos que han usado este algoritmo a lo largo de los años.

Se crea un texto.txt con un texto cualquiera que usaremos tanto para este ejemplo como para el resto del documento.

En un lugar de la Mancha de cuyo nombre no quiero acordarme...

.

Paso 1

Se calcula el resumen MD5 del fichero "texto.txt".

openssl dgst -md5 texto.txt

MD5(texto.txt)= 4fa02d78a06b3833c190b464261d8c08

Como ejemplo de cómo varía un resumen ante mínimos cambios en el fichero de entrada, usaremos ahora un fichero "texto2.txt" idéntico, salvo la primera letra en minúsculas:

en un lugar de la Mancha de cuyo nombre no quiero acordarme...

.

Paso 2

Se calcula el resumen MD5 del fichero "texto2.txt".

openssl dgst -md5 texto2.txt

MD5(texto2.txt)= 5ed88c107e07da73dcfa03893bb8e822

Y se observa que es absolutamente diferente del resumen anterior.

Paso 3

En este caso, demostraremos que cualquier función de resumen produce un "hash" de salida, aunque la entrada sea nula:

echo ""| openssl dgst -md5

(stdin)= 68b329da9893e34099c7d8ad5cb9c940

SHA-1

SHA-1 ( Secure Hash Algorithm 1 ) es una función criptográfica de resumen que admite cualquier entrada y produce un resultado de 160 bits (20 bytes), que generalmente se representa como un número hexadecimal , de 40 dígitos de longitud. Fue diseñado por la Agencia de Seguridad Nacional de los Estados Unidos y es un estándar de procesamiento de información federal de los Estados Unidos. [6]

En 2005, se identificaron fallos de seguridad en el SHA-1, permitiendo que existiera una debilidad matemática (ver la web http://shattered.io) evidenciando así la necesidad de sustituir el empleo de SHA-1 por funciones hash más robustas, como la familia SHA-2 que veremos en el apartado siguiente.

Paso 1

Se realizará un resumen SHA-1 del mismo fichero "texto.txt", usado en los ejemplos anteriores.

openssl dgst -sha1 texto.txt

SHA1(texto.txt)= 50820e3061249bb5470aa558eeb3da769369a6e3

SHA-2

SHA-2 es una familia de funciones hash criptográficas, con diversos tamaños de salida en bits (SHA2-224, SHA2-256, SHA2-384 y SHA2-512) diseñadas por la Agencia de Seguridad Nacional (NSA) y publicada en 2001 por el Instituto Nacional de Estándares y Tecnología (NIST) como un Estándar Federal de Procesamiento de la Información (FIPS). [7]

SHA224

Produce resúmenes de 224 bits (28 bytes) que generalmente se representan como un número hexadecimal de 56 dígitos de longitud. En las versiones actuales de OpenSSL se acostumbra a nombrar las funciones de la familia SHA-2 indicando directamente el tamaño después de la palabra SHA, es decir, SHA2-224 se nombra como "sha-224".

Paso 1

Se realizará un resumen SHA2-224 del mismo fichero "texto.txt" usado en los ejemplos anteriores.

openssl dgst -sha224 texto.txt

SHA224(texto.txt)= 6e911e52c586fb578608f582321eed909b9147569b824bc4eb79d785
SHA256

Produce resúmenes de 256 bits (32 bytes) que generalmente se representan como un número hexadecimal de 64 dígitos de longitud.

Paso 1

Se realizará un resumen SHA2-256 del mismo fichero "texto.txt" usado en los ejemplos anteriores.

openssl dgst -sha256 texto.txt

SHA256(texto.txt)= 18bd46db70c25f5af60aeaf927754b9d212cadfaa650895631775de3bbb44114
SHA384

Produce resúmenes de 384 bits (48 bytes) que generalmente se representan como un número hexadecimal de 96 dígitos de longitud.

Paso 1

Se realizará un resumen SHA2-384 del mismo fichero "texto.txt" usado en los ejemplos anteriores.

openssl dgst -sha384 texto.txt

SHA384(texto.txt)= 5d52867897694aacb4cc9055ea004819d598db736ae86e08980950de1f09a05d4428ec87289191276235c551f6597b22
SHA-512

Produce resúmenes de 512 bits (64 bytes) que generalmente se representan como un número hexadecimal de 128 dígitos de longitud.

Paso 1

Se realizará un resumen SHA2-512 del mismo fichero "texto.txt" usado en los ejemplos anteriores.

openssl dgst -sha512 texto.txt

SHA512(texto.txt)= d05dda99543ca29ec4b9ad2f4b7049c09934ecff527a28a42f88d2bf968a80bdd18c88983ff67bb87a79b3494395702371d8cee0e31127b73252227f39898bf8

SHA-3

La familia de funciones SHA-3 es el último miembro de la familia de estándares de Secure Hash Algorithm, publicado por NIST el 5 de agosto de 2015. SHA-3 es un posible sustituto de los algoritmos SHA-2 si se descubre alguna vulnerabilidad en estos. [8]

SHA-3 genera las mismas longitudes de resumen que SHA-2 (SHA3-224, SHA3-256, SHA3-384 y SHA3-512). En este caso usaremos como ejemplos solamente SHA3-384 y SHA3-512.

SHA3-384
Paso 1

Se realizará un resumen SHA3-384 del mismo fichero "texto.txt" usado en los ejemplos anteriores.

openssl dgst -sha3-384 texto.txt

SHA3-384(texto.txt)= 3e0c626b47f8b9a41b975913801b6076bd8f737483b6b4b14c72f80e701b77f653cebf46a5ade8f9dbe876c7043d829e
SHA3-512
Paso 1

Se realizará un resumen SHA3-384 del mismo fichero "texto.txt" usado en los ejemplos anteriores.

openssl dgst -sha3-512 texto.txt

SHA3-512(texto.txt)= 47689e88171715227d8c5dbb48eed6e45ca969dc25895da01eb0b63933dd0363d2671f3e486236c5af2e711f9a003d1f4e6c1beddf6644f0bcaed9b8b80df967

MAC (Message authentication code)

En criptografía , un código de autenticación de mensaje (MAC), es una información breve que se utiliza para autenticar un mensaje; en otras palabras, para confirmar que el mensaje proviene del remitente indicado (su autenticidad) y que el mensaje no haya sido alterado. Los valores MAC se calculan mediante la aplicación de una función hash criptográfica con clave secreta K, que sólo conocen el remitente y destinatario, pero no los atacantes. El valor MAC protege tanto la integridad de los datos de un mensaje como su autenticidad , al permitir que los verificadores (que también poseen la clave secreta) detecten cualquier cambio en el contenido del mensaje. Los algoritmos MAC pueden construirse a partir de otras primitivas criptográficas, como las funciones criptográficas hash (como en el caso de HMAC ). [9]

Tipos de MAC

HMAC (hash-based message authentication code)

HMAC (a veces entendido como código de autenticación de mensaje hash con clave o código de autenticación de mensaje basado en hash ) es un tipo específico de código de autenticación de mensaje (MAC) que incluye una función de hash criptográfica y una clave criptográfica secreta . Puede usarse para verificar simultáneamente la integridad de los datos y la autenticación de un mensaje , como con cualquier MAC. Cualquier función hash criptográfica, como SHA256 o SHA-3, puede ser utilizado en el cálculo de un HMAC; el algoritmo MAC resultante se denomina HMAC-X, donde X es la función hash utilizada (por ejemplo, HMAC-SHA256 o HMAC-SHA3). La fuerza criptográfica de la HMAC depende de la fuerza criptográfica de la función hash subyacente, el tamaño de su salida de hash y el tamaño y la calidad de la clave. [10]

Paso 1

Se procede a obtener el HMAC del "texto.txt" usando una contraseña específica ("control1995"). Para ello, se utilizará la función hash "sha-512" como se muestra a continuación:

openssl dgst -hmac-sha512 "control1995" texto.txt

HMAC-SHA512(texto.txt)= 62ad3592dbdfc00ce70f16228e66884e82468b94ac18ab44ae6fcaa5b3c39a4c0f94e57d87b2fc7cfba18616081d245858f474944252e1eb6beec2362bf67862
Paso 2

Para verificar que si se cambia la contraseña se produce un HMAC diferente, se repetirá el mismo paso acortando la contraseña anterior.

openssl dgst -sha512 -hmac "control" texto.txt

HMAC-SHA512(texto.txt)= 0c89913b70372eb77dd0631133275becce14459d57de0e1144d92b3fdba350cb9e9ba5af4eff62469419eb726e722e8e96547fcf3235c63fb55dcfdb8df6fc83

Criptografía Simétrica

La criptografía de clave simétrica, también llamada criptografía de clave privada o de clave secreta, es un método criptográfico en el cual se usa una misma clave para cifrar y descifrar mensajes en el emisor y el receptor. Las dos partes que se comunican han de ponerse de acuerdo de antemano sobre la clave a usar. Una vez que ambas partes tienen acceso a esta clave, el remitente cifra un mensaje usando la clave, lo envía al destinatario, y éste lo descifra con la misma clave. [11]

Aunque existan algoritmos que vayan siendo desechados por las vulnerabilidades que se van descubriendo, no se pueden dejar de lado, ya que existen documentos anteriores cifrados con estos algoritmos y se necesita conocer su contenido. Con el paso del tiempo, estos documentos irán desapareciendo, siendo reemplazados por algoritmos más seguros y fiables.

Para proceder a cifrar o descifrar mensajes se hará uso del comando -enc. Se utiliza tanto para cifrados de bloque como de flujo, haciendo uso de claves basadas en contraseñas o claves proporcionadas explícitamente (clave y vector de inicialización, en su caso).

MUY IMPORTANTE: Cuando se cifra con contraseña, OpenSSL pasa esta contraseña, junto con 64 bits aleatorios de sal criptográfica, por un algoritmo de derivación de claves como el PBKDF1 (obsoleto) o el PBKDF2 (explicado en las "opciones de enc"). Estos algoritmos utilizan funciones de resumen de forma recursiva para obtener suficientes bits para la clave de cifrado y para el vector de inicialización si es necesario. Esto permite que para una misma contraseña, se generen diferentes claves, al variar en cada caso la sal obtenida aleatoriamente.

A continuación, se muestra algunas de las opciones más importantes que nos permite realizar el comando -enc y de las cuáles se harán uso durante el desarrollo de los ejemplos. Hay que tener en cuenta, que en algunos ejemplos hemos expuesto comandos donde la contraseña aparece explícita y eso es muy peligroso. Por ello, se desaconseja el uso de dichos comandos aunque en esta wiki se use para fines didácticos. En situaciones de uso real, siempre hemos de intentar que la contraseña sea solicitada por el comando e introducida de forma no visible en pantalla.


Comando enc

-in filename
Se introduce el fichero que se quiere cifrar.
-out filename
Se escribe el nombre del fichero de salida que contendrá el texto cifrado.
-e
Para cifrar el fichero de entrada.
-d
Para descifrar el fichero de entrada.
-a
Para cifrar el fichero de entrada en Base64.
-k password
Para especificar una contraseña (en desuso). Su equivalente y el que se recomienda usar a día de hoy es -pass pass: password (aunque desaconsejamos esto)
-kfile filename
Fichero que contiene la contraseña (en desuso). Su equivalente y el que se recomienda usar a día de hoy es -pass file.
-pass pass: password
Igual que "-k password".
-pass file
Igual que "-kfile filename".
-p
Cifra y muestra en pantalla la clave, el vector de inicialización y el valor de sal.
-P
No cifra, simplemente muestra en pantalla la clave, el vector de inicialización y el valor de sal.
-K key
Se proporciona la clave real directamente. Siempre que se introduce la clave, obligatoriamente se introducirá también el vector de inicialización (-iv IV) salvo que el algoritmo no lo use.
-iter count
Utilice un número dado de iteraciones en la contraseña para derivar la clave de cifrado. Los valores altos aumentan el tiempo requerido para forzar el archivo resultante. Esta opción permite el uso del algoritmo PBKDF2 para derivar la clave (recordemos que PKBDF1 está obsoleto).
-pbkdf1
Leer -pbkdf2. Tiene la misma funcionalidad que su sucesor pero con la diferencia de que este último tiene capacidad para generar claves de más de 160 bits (128, 256, 512 bits). Hay que tener en cuenta que si se usa una de las dos versiones a la hora del cifrado, se tiene que usar la misma función para el descifrado, ya que no son compatibles. Por ello, cuando se manipulen ficheros cifrados, hay que saber cuál de las dos versiones se ha usado. Aunque -pbkdf1 está en desuso, hay que conocerla debido a que existen ficheros antiguos cifrados con este sistema de derivación de claves.
-pbkdf2
Usar algoritmo PBKDF2 con el número de iteraciones predeterminado al no ser que diga lo contrario. PBKDF2 aplica una función pseudoaleatoria (HMAC con cualquier función hash aprobada: HMAC-SHA1) a la contraseña de entrada o frase de contraseña junto con un valor de sal y repite el proceso muchas veces (mínimo se recomienda 1000 iteraciones) para producir una clave derivada, que luego se puede usar como una clave criptográfica en operaciones posteriores. El trabajo computacional agregado hace que el "craqueo" de contraseñas por fuerza bruta sea mucho más difícil. La norma recomienda una longitud de sal de al menos 64 bits, que es la que utiliza OpenSSL.[12]
-md messagedigest 
especifica el resumen del mensaje que se utiliza para la derivación de clave. Puede tomar uno de los valores md2 , md5 , sha o sha2 . El algoritmo predeterminado es sha2-256. [13]

Antes de empezar con algunos ejemplos de los algoritmos más relevantes de cifrado simétrico, hay que entender que existen diferentes métodos de cifrado que usan a su vez, diferentes modos de operación.

Cifrado en bloque

Cifrado por bloques.

En criptografía, una unidad de cifrado por bloques (en inglés, block cipher) es una unidad de cifrado de clave simétrica que opera en grupos de bits de longitud fija, llamados bloques, aplicándoles una transformación invariante. Cuando se realiza el cifrado, una unidad de cifrado por bloques toma un bloque de texto plano o claro como entrada y produce un bloque de igual tamaño de texto cifrado. La transformación exacta es controlada utilizando una segunda entrada — la clave secreta. El descifrado es similar: se ingresan bloques de texto cifrado y se producen bloques de texto plano. [14]

Un concepto importante en el cifrado por bloques es el Padding. Se trata de un esquema de relleno necesario que usan algunos modos de operación de cifrado en bloque para completar los mensajes que no tengan una longitud múltiplo del tamaño de bloque. El "padding" estándar en OpenSSL se describe en la especificación PKCS5.

Otra idea que cabe destacar, es el vector de inicialización o IV. El IV es un bloque de bits que es requerido para permitir un cifrado en flujo o un cifrado por bloques, en uno de los modos de cifrado, con un resultado independiente de otros cifrados producidos por la misma clave. El tamaño del IV dependen del algoritmo de cifrado y del protocolo criptográfico y usualmente es tan largo como el tamaño de bloque (cifradores en bloque) o como el tamaño de la clave (cifradores en flujo). Habitualmente el IV se genera de forma aleatoria o pseudoaleatoria al mismo tiempo que la clave de cifrado (por empleo de funciones del tipo PBKDF2). [15]


Modos de Operación de algoritmos de cifrado en bloque para cifrado en bloque

Los modos de operación más comunes son:

  • ECB (Electronic CodeBook): Este modo de cifrado es el más simple de todos, pues se limita a partir el mensaje en bloques y cifrarlos por separado. [16].

ECB encryption.svg

ECB decryption.svg

La desventaja de este método es que bloques idénticos de mensaje sin cifrar producirán idénticos textos cifrados, mientras que al resto de modos de operación no les ocurre esta situación porque combinan bloques anteriores de texto claro o cifrado de tal modo que idénticos bloques de texto claro producirán bloques diferentes de texto cifrado. Esto explica la necesidad del vector de inicialización (IV) para enmascarar el primer bloque. Este problema se puede observar gráficamente si se cifra una imagen en colores sólidos:

  • CBC (Cipher Block Chaining): El modo de cifrado CBC divide el mensaje en bloques y usa XOR para combinar el cifrado del bloque anterior con el texto plano del bloque actual. Como no se dispone de un texto cifrado con el que combinar el primer bloque, se genera un vector de inicialización que cambia aleatoriamente cada vez que se empieza un cifrado desde 0. [17] Tanto en los modos de operación ECB y CBC, el último bloque de texto debe ser rellenado (paddding) antes del proceso de cifrado, ya que las dimensiones de los mensajes son variables y el cifrador en bloque opera con bloques de tamaño fijo.

CBC encryption.svg

CBC decryption.svg

Modos de Operación de algoritmos de cifrado en bloque para cifrado en flujo

Aunque los modos de operación CFB, OFB y CTR se aplican a cifradores en bloque, realmente producen un cifrado en flujo, ya que el cifrador de bloque se emplea para generar un "keystream" que será combinado con el texto claro bit a bit para producir el texto cifrado. Por ello, los englobamos en este apartado.

  • CFB (Cipher FeedBack): el modo de retroalimentación de cifrado (CFB), un pariente cercano de CBC, convierte un cifrado de bloque en un cifrado de flujo. La operación es muy similar; en particular, el descifrado CFB es casi idéntico al cifrado CBC realizado a la inversa y que además, evita el rellenado de bloques. [18] Por tanto, hace que el cifrado en bloque opere como una unidad de flujo de cifrado: se generan bloques de flujo de claves, que son operados con XOR y el texto en claro para obtener el texto cifrado. [19]

CFB encryption.svg

CFB decryption.svg

  • OFB (Output FeedBack): emplea una clave para crear un bloque pseudoaleatorio que es operado a través de XOR con el texto claro para generar el texto cifrado. Requiere de un vector de inicialización que debe ser único para cada ejecución realizada. [20].

OFB encryption.svg

OFB decryption.svg

  • CTR (Counter): genera el siguiente bloque pseudoaleatorio cifrando valores sucesivos de un "contador". El contador puede ser cualquier función que produzca una secuencia que se garantiza que no se repetirá durante mucho tiempo, aunque un contador real de incremento por uno es el más simple y el más popular. Si el IV / nonce es aleatorio, entonces pueden combinarse con el contador utilizando cualquier operación sin pérdida (concatenación, adición o XOR) para producir el bloque de contador único real para el cifrado. [21]

CTR encryption 2.svg

CTR decryption 2.svg

Algoritmos de cifrado en bloque con modo de operación de bloque

DES (Data Encryption Standard)

DES es el algoritmo prototipo del cifrado por bloques — un algoritmo que toma un texto en claro de una longitud fija de bits y lo transforma mediante una serie de operaciones básicas en otro texto cifrado de la misma longitud. En el caso de DES el tamaño del bloque es de 64 bits. DES utiliza también una clave criptográfica para modificar la transformación, de modo que el descifrado sólo puede ser realizado por aquellos que conozcan la clave concreta utilizada en el cifrado. La clave mide 64 bits, aunque en realidad, sólo 56 de ellos son empleados por el algoritmo. Los ocho bits restantes se utilizan únicamente para comprobar la paridad, y después son descartados. Por tanto, la longitud de clave efectiva en DES es de 56 bits, y así es como se suele especificar. [22]

Este algoritmo es considerado no seguro, ya que su tamaño de clave de 56 bits es corto y con ello, han habido casos en que las claves de DES se han roto en un día. Más adelante, se verá una variante de este algoritmo considerado más segura, como es el Triple DES.

DES - ECB
Paso 1

En este ejemplo cifraremos el fichero de ejemplo texto.txt con DES en modo ECB (recordemos lo peligroso que es este modo de operación ECB y NO LO USEMOS NUNCA EN LA VIDA REAL)

openssl enc -des-ecb -a -in texto.txt -out des_ecb.cif

Se tendrá que introducir una contraseña, la cuál se usará tanto para cifrar como descifrar. Además, el resultado estará en base 64 ya que utilizamos la opción "-a".

Paso 2

Para verificar que se ha cifrado el fichero correctamente se muestra el contenido del fichero de salida por la terminal:

cat des_ecb.cif

U2FsdGVkX19kW3Tq3F0Sh9ELdcdlloEOs1pJsOG24MuvuOBPfvaHE/nK0iBtb9F1HlxZw5Whn+eAXXABg/d9DjXnl0pRKjpheO4pP9rPug0=
Paso 3

Se descifra el fichero que se ha cifrado antes de la siguiente manera (Se usa "-d" para indicar que se va a descifrar el fichero de entrada y si se desea se ejecuta un cat del fichero de salida para verificar el resultado):

openssl enc -des-ecb -d -a -in des_ecb.cif -out texto_desc.txt

DES - CBC

Si se pone solo "-des" sin modo de operación, por defecto usará el modo de operación CBC, mucho más seguro que el ECB del ejemplo anterior.

Paso 1

En este caso cifraremos el texto.txt proporcionando la contraseña "luna77" en la misma línea de comando (opción no recomendada):

1) openssl enc -des-cbc -a -k luna77 -in texto.txt -out des_cbc.cif

En este caso no se tendrá que introducir ninguna contraseña, ya que se ha proporcionado al ejecutar el comando anterior.

Paso 2

Para verificar que se ha cifrado el fichero correctamente se muestra el contenido del fichero de salida por la terminal:

cat des_cbc.cif

U2FsdGVkX18ASWAnYV+LYwjtb8A0jTXXaFYXI9BEtMSyUXPCXmhNrHtC6LFg3+WGQFcXPAWb/ptzZV2lNBkFNrgnlabYRunACGZ3mJSS/xU=
Paso 3

Se descifra el fichero que se ha cifrado antes de la siguiente manera (si se desea se ejecuta un cat del fichero de salida para verificar el resultado):

openssl enc -des-cbc -d -a -k luna77 -in des_cbc.cif -out texto_desc.txt

TRIPLE DES

En criptografía, Triple DES se le llama al algoritmo que hace triple cifrado del DES. También es conocido como TDES o 3DES, fue desarrollado por IBM en 1998. El Triple DES está desapareciendo lentamente, siendo reemplazado por el algoritmo AES. Sin embargo, la mayoría de las tarjetas de crédito y otros medios de pago electrónicos tienen como estándar el algoritmo Triple DES (anteriormente usaban el DES). Por su diseño, el DES y por lo tanto el TDES son algoritmos lentos. AES puede llegar a ser hasta 6 veces más rápido y a la fecha no se ha encontrado ninguna vulnerabilidad [23].


TDES usa una longitud de 168 bits (3x56) aunque realmente su eficiencia es de 112 bits, es decir, dobla la longitud de clave de DES. Por ello, TDES no se considera vulnerable a los ataques por fuerza bruta, al contrario que su antecesor que poseía una longitud de clave corta. Además, se continúa cifrando bloques de 64 bits.

Existen diferentes tipos de TDES, aunque el más utilizado es el EDE3 (Encrypt-Decrypt-Encrypt) con dos claves DES. Es decir, el cifrado se aplica al contenido mediante la clave 1, luego este texto cifrado se descifra con la clave 2 y finalmente, el texto descifrado se vuelve a cifrar con la clave 2.

DES - EDE3 - CBC

Aprovecharemos un ejemplo de utilización del algoritmo des-ede-cbc para ilustrar el empleo de contraseñas y cómo se introduce automáticamente la sal en el fichero cifrado cuando se emplean contraseñas para el cifrado con cualquier tipo de algoritmo de cifrado y/o modo de operación.

La sal 'salt' es una cadena aleatoria de 8 bytes que se almacena con el archivo cifrado para que cada vez que cifre un archivo con una contraseña específica el archivo resultante será diferente. La sal está activada siempre por defecto. La sal se identifica por el encabezado de 8 bytes ( Salted__ ), seguido por la sal de 8 bytes. Hay que tener en cuenta que si ciframos el contenido de un fichero con una contraseña, la sal se identifica en el texto cifrado por un encabezado de 8 bytes ( Salted__ ), seguido por la sal de 8 bytes.

En este ejemplo, cifraremos con una contraseña y luego usaremos la clave y el IV para el descifrado, eliminando los primeros 16 bytes del fichero cifrado antes de descifrarlo.

Paso 1

En este caso cifraremos el texto.txt de manera que se solicite la contraseña y se muestre en pantalla la sal, la clave y el vector de inicialización (opción -p):

openssl enc -des-ede3-cbc -p -in texto.txt -out des_ede3_cbc.cif

salt=D30F902E2A9DCF99
key=6581AB49BC17A188D8E2BE8C547734F568F78DDAA6442CCD
iv =DFDBFE410F5BD79A
Paso 2

Para verificar que se ha cifrado el fichero correctamente se muestra el contenido del fichero de salida por la terminal, el fichero cifrado es binario (no se usó la opción -a) pero los primero ocho caracteres serán textuales, ya que es la cadena "Salted__" que indica que los ocho bits siguientes contienen la sal:

cat des_ede3_cbc.cif

 
Salted__??.*?ϙg?W:?ç?PX3?	u
&?Qxo9?*u?
          ?h???9???3y
                     	R\Z??H?"?t?5"?x
Paso 3

Para poder descifrar el fichero con la clave y el IV, primero hemos de "extraer" el texto "Salted__" y los ocho bits de sal (16 bytes en total) como se indica a continuación:

cat des_ede3_cbc.cif | dd ibs=16 obs=16 skip=1 > des_ede3_cbc_sinsal.cif

Paso 4

Para verificar que se ha extraido correctamente la sal, se muestra el contenido del fichero de salida por la terminal:

cat des_ede3_cbc_sinsal.cif

 
g?W:?ç?PX3?	u
&?Qxo9?*u?
          ?h???9???3y
                     	R\Z??H?"?t?5"?x

Al comparar este fichero con el fichero des_ede3_cbc.cif, se observa que se han eliminado parte de los bytes correspondientes a la sal (16 primeros bytes).

Paso 5

Para descifrar, se hará uso de la clave y el IV obtenidos por pantalla en el primer paso:

5) openssl enc -des-ede3-cbc -d -in des_ede3_cbc_sinsal.cif -out texto_desc.txt -K 6581AB49BC17A188D8E2BE8C547734F568F78DDAA6442CCD -iv DFDBFE410F5BD79A

Al realizar un cat del fichero de salida se podrá leer el texto original.

Nota: si no se especifica el modo de operación, por defecto se usará "cbc".

AES (Advanced Encryption Standard)

AES, también conocido como Rijndael (pronunciado "Rain Doll" en inglés), es un esquema de cifrado por bloques adoptado como un estándar de cifrado por el gobierno de los Estados Unidos. El AES fue anunciado por el Instituto Nacional de Estándares y Tecnología (NIST) como FIPS PUB 197 de los Estados Unidos (FIPS 197) el 26 de noviembre de 2001 después de un proceso de estandarización que duró 5 años. Se transformó en un estándar efectivo el 26 de mayo de 2002. Desde 2006, el AES es uno de los algoritmos más populares usados en criptografía simétrica. El cifrado fue desarrollado por dos criptólogos belgas, Joan Daemen y Vincent Rijmen, ambos estudiantes de la Katholieke Universiteit Leuven, y fue enviado al proceso de selección AES bajo el nombre "Rijndael".[24]

Basado en la estructura de bloques de AES, el cambio de un solo bit, ya sea en la clave, o en el bloque de texto sin cifrado, da como resultado un bloque de texto cifrado completamente diferente [25]. Este algoritmo tiene una longitud de bloque de 128 bits y longitudes de clave de 128, 192 y 256.

Se trata de un algoritmo del que todavía no se ha registrado ningún ataque factible hacia él, convirtiéndose en un estándar de cifrado para las principales organizaciones como bancos, gobiernos y sistemas de alta seguridad en todo el mundo. Además, es un estándar mucho más rápido que los vistos anteriormente.

AES - 128 - CBC
Paso 1

En este caso se cifrará el texto.txt de manera que se muestre la sal, la clave y el vector de inicialización para poder observar como varía la key según el tamaño de clave utilizada(128, 192 o 256 bits).

De la misma manera con la que hemos descifrado en DES - EDE3 - CFB , se podría hacer con AES. En este caso, solo mostraremos la sal, la clave y el vector de inicialización con fines didácticos.

openssl enc -aes-128-cbc -p -in texto.txt -out aes_128_cbc.cif

salt=D4CB02846DF52631
key=E0F912BD4D46C5E051C0E8AB296C087A
iv =F63249B4C246608579EEC44996AEAD7E

En este caso se tendrá que introducir una contraseña con la que se cifrará y descifrará los ficheros.

Paso 2

Para verificar que se ha cifrado el fichero correctamente se muestra el contenido del fichero de salida por la terminal:

cat aes_128_cbc.cif

 
Salted__???m?&1???o?~#??[A????6??S(?r+?O?l M<0????{????H???h??(m?!?
Paso 3

Para descifrar el fichero lo hacemos directamente sin necesidad de extraer la sal:

openssl enc -d -aes-128-cbc -in aes_128_cbc.cif -out aes_128_desc.txt

enter aes-128-cbc decryption password:
Paso 4

Verificamos que el descifrado se ha hecho correctamente.

cat aes_128_desc.txt

En un lugar de la Mancha de cuyo nombre no quiero acordarme...

Nota: si no se especifica el modo de operación, por defecto se usará "cbc".

Cifrado en Flujo

La operación del generador de flujo de clave en A5 / 1 , un cifrado de flujo basado en LFSR utilizado para cifrar conversaciones de teléfono móvil.

Para algunas aplicaciones, tales como el cifrado de conversaciones telefónicas, el cifrado en bloques es inapropiada porque los flujos de datos se producen en tiempo real en pequeños fragmentos. Las muestras de datos pueden ser tan pequeñas como 8 bits o incluso de 1 bit, y sería un desperdicio rellenar el resto de los 64 bits antes de cifrar y transmitirlos. Los cifradores de flujo son algoritmos de cifrado que pueden realizar el cifrado incrementalmente, convirtiendo el texto en claro, en texto cifrado bit a bit, es decir, cada dígito de texto sin formato se cifra uno a la vez con el dígito correspondiente de la secuencia pseudoaleatoria, para dar un dígito del flujo de texto cifrado. Una secuencia pseudoaleatoria es una secuencia de bits de tamaño arbitrario que puede emplearse para oscurecer los contenidos de un flujo de datos combinando esta secuencia con el flujo de datos mediante la función XOR. Si la secuencia pseudoaleatoria es segura, el flujo de datos cifrados también lo será. Los bloques se cifran empleando una clave compartida por el emisor y el receptor. [26]

Uno de los algoritmos de flujo más utilizados es el RC4 (ya obsoleto), reemplazado en la actualidad por algoritmos más eficientes como el Chacha20 y los modos de operación en flujo (OFB o CFB) de los cifradores de bloque como TDES, AES, etc.


Algoritmos de cifrado en flujo (nativos)

RC4

Dentro de la criptografía RC4 o ARC4 es el sistema de cifrado de flujo Stream cipher más utilizado y se utilizó en algunos de los protocolos más populares como Secure Sockets Layer (SSL) (para proteger el tráfico de Internet) y Wired Equivalent Privacy (WEP) para añadir seguridad en las redes inalámbricas. En los últimos años, RC4 se ha excluido de los estándares de alta seguridad por sus debilidades. No está recomendado su uso en los nuevos sistemas y el estándar TLS de cifrado web y los protocolos WPA de cifrado en Wifi lo excluyen.

Paso 1

Ahora se procederá a cifrar el fichero texto.txt pero usando un cifrado de flujo RC4. Se tendrá que introducir una contraseña.

openssl enc -rc4 -a -pbkdf2 -in texto.txt -out rc4.cif

Paso 2

Para verificar que se ha cifrado el fichero correctamente se muestra el contenido del fichero de salida por la terminal:

cat rc4.cif

 U2FsdGVkX1+NGFlYsDGIrvaeo21Gg7pkI+OD0ZjU7QzS97w7q5HP2xNnz7BxBew2 
6tiHQXgAAfp7P0zZq+6PIBFRVEy61wU2wNg+tpVy
Paso 3

Para descifrar, ejecutamos el siguiente comando y posteriormente introducimos la misma contraseña que se usó para el cifrado:

openssl enc -rc4 -d -a -pbkdf2 -in rc4.cif -out texto_desc.txt

Al realizar un cat del fichero de salida se podrá leer el texto original si se desea verificar que el descifrado se ha efectuado correctamente.

Chacha20

Salsa20 ChaCha variant.png

Es un sistema de cifrado en flujo, que soporta claves de 128 y 256 bits y de alta velocidad creado por Bernstein en 2008. Salsa20 es el cifrado original creado también por Bernstein en 2007, el cuál mantiene una estrecha relación con su sucesor, ya que ambos cifrados se basan en una función pseudoaleatoria basada en operaciones add-rotate-xor (ARX). Salsa20 y ChaCha poseen la inusual ventaja de que el usuario puede buscar de manera eficiente cualquier posición en el flujo de claves en tiempo constante.

La principal diferencia entre ellos, es que Chacha20 ofrece un aumento de la difusión por ronda y logra ligeramente un mejor rendimiento. Además, se considera que en implantaciones software es más eficiente y rápido que AES.

Paso 1

Se cifra el texto.txt con Chacha20 usando esta vez la funcion -pass pass:password (desaconsejada).

openssl enc -chacha20 -a -pbkdf2 -pass pass:informatica95 -in texto.txt -out chacha20.cif

Paso 2

Para verificar que se ha cifrado el fichero correctamente se muestra el contenido del fichero de salida por la terminal:

2) cat chacha20.cif

 
U2FsdGVkX19A+Yp7zsXDMD/VDIsgYsdM5nxu037Ku0a8zlyCocLhq9G6t+UPSDug
N98wSwM0RPfBOUVyEKMk99hWwNFWKESgg0WCFLXi
Paso 3

Para descifrar ejecutamos el siguiente comando incluyendo la contraseña como se hizo para cifrar:

openssl enc -chacha20 -d -a -pbkdf2 -pass pass:informatica95 -in chacha20.cif -out texto_desc.txt

Al realizar un cat del fichero de salida se podrá leer el texto original si se desea verificar que el descifrado se ha efectuado correctamente.

Algoritmos de cifrado en bloque en modo de operación de flujo

Como ya hemos indicado, los modos de operación CFB, OFB y CTR transforman cifradores de bloque en cifradores de flujo, veamos un ejemplo con Triple DES y otro con AES

DES - EDE3 - OFB

Anteriormente se ha usado el comando -k para introducir la contraseña directamente pero cada vez se usa menos. Su equivalente y el que se recomienda usar a día de hoy es -pass pass:password cuya función es la misma que la anterior, aunque insistimos en que es mejor no poner esta opción y teclear la contraseña directamente.

Paso 1

Se cifra el texto.txt usando el comando nombrado en la descripción de la siguiente manera:

openssl enc -des-ede3-ofb -a -pass pass:prueba+1 -in texto.txt -out des-ede3.ofb.cif

Al introducir la contraseña prueba+1 arriba, no se pedirá introducir contraseña alguna al ejecutar el comando.

Paso 2

Para verificar que se ha cifrado el fichero correctamente se muestra el contenido del fichero de salida por la terminal:

cat des-ede3.ofb.cif

 
U2FsdGVkX1807oH+u4mohMA8SHgqVU+GjyJQppx51rPbRt/IINW3PftAC6Y9v1vx
CR4T73xtuUP5boyWMqjWKQKQer3rWlDdzoeBpYEM
Paso 3

Para descifrar se puede hacer de dos formas. Una de ellas es introducir directamente la contraseña como se ha hecho para cifrar, o introducirla después de ejecutar el comando.

openssl enc -des-ede3-ofb -d -a -pass pass:prueba+1 -in des-ede3.ofb.cif -out texto_desc.txt

cat texto_desc.txt

En un lugar de la Mancha de cuyo nombre no quiero acordarme...

o

openssl enc -des-ede3-ofb -d -a -in des-ede3.ofb.cif -out texto_desc.txt

enter des-ede3-ofb decryption password:

4) cat texto_desc.txt

En un lugar de la Mancha de cuyo nombre no quiero acordarme...

Se puede verificar que de las dos formas se puede descifrar correctamente el fichero cifrado.

AES - 192 - CFB

En este ejemplo usaremos AES de 192 bits para cifrar con modo CFB, lo que resultará en un cifrado de flujo.

Paso 1

Se va a cifrar el texto.txt usando -pass: file:filename. El filename corresponde con el archivo que contiene la contraseña, en este ejemplo el fichero se llamará "passwd.txt".

openssl enc -aes-192-cfb -p -pbkdf2 -md sha1 -pass file:passwd.txt -in texto.txt -out aes_192_cfb.cif

salt=B80C38A686E22ABF
key=2D638C6CA5092F3313EB4E8F3CF45790D1F3298F66068151
iv =B1E385CBD9DA80579F6FB37F5528C8BB

Se puede observar que el tamaño de la clave es mayor (48 caracteres hexadecimales), mientras que el vector de inicialización se mantiene constante en los 32 caracteres hexadecimales (128 bits) del tamaño de bloque, que es el mismo para los tres tamaños de clave de AES.

Paso 2

Para descifrar se haría de la misma manera que en el paso 1, colocando la opción "-d" y permutando los valores de las opciones "-in" y "-out".

AES - 256 - CTR

En este ejemplo usaremos AES de 256 bits para cifrar con modo CTR, lo que resultará en un cifrado de flujo.

Paso 1

Cifraremos el fichero texto.txt usando -pass: file:filename. El filename corresponde con el archivo que contiene la contraseña, en este ejemplo el fichero se llamará "passwd.txt". Además, se introducirá la opción "-pbkdf2" para emplear la derivación de clave más potente.

openssl enc -aes-256-ctr -a -pbkdf2 -pass file:passwd.txt -in texto.txt -out aes_256_ctr.cif

Paso 2

Para verificar que se ha cifrado el fichero correctamente se muestra el contenido del fichero de salida por la terminal:

cat aes_256_ctr.cif

 
U2FsdGVkX1+QVMdAUpGCvAwjUuRa5GuxggUJ4DFQB1RY9LcjP6RJnQJ+zvNcKidr
jPcbam7ESyfQqa9JRg/uL/F3KZvx7OFHThJwLNt9
Paso 3

Para descifrar, podemos ejecutar el siguiente comando (que no tiene la opción -pass file:passwd.txt) y posteriormente introducimos la contraseña contenida en dicho fichero:

openssl enc -aes-256-ctr -d -a -pbkdf2 -in aes_256_ctr.cif -out texto_des.txt

enter aes-256-ctr decryption password:
Paso 4

Al realizar un cat del fichero de salida se podrá leer el texto original.

cat texto_des.txt

En un lugar de la Mancha de cuyo nombre no quiero acordarme...

Criptografía Asimétrica

Introducción

En este apartado hablaremos de los distintos algoritmos de criptografía asimétrica más importantes, explicando sus conceptos básicos y posteriormente, en los siguientes apartados se realizarán las operaciones correspondientes con cada uno de ellos.

Primero hablaremos del algoritmo RSA(Rivest, Shamir y Adleman), que es un sistema criptográfico de clave pública desarrollado en 1979. Es el primer y más utilizado algoritmo de este tipo y es válido tanto para cifrar como para firmar digitalmente. RSA se basa en la dificultad para factorizar grandes números. Las claves pública y privada se calculan a partir de un número que se obtiene como producto de dos primos grandes. [27][28] Las claves RSA son normalmente de entre 1024-8192 bits de longitud, siendo el tamaño más usado actualmente de 2048 ó 4096 bits de longitud.

Otro algoritmo que pertenece a la criptografía asimétrica es el DSA (Digital Signature Algorithm), un estándar del Gobierno Federal de los Estados Unidos de América o FIPS para firmas digitales. DSA se hizo público el 30 de agosto de 1991, este algoritmo como su nombre lo indica, sirve para firmar y no para cifrar información. Una desventaja de este algoritmo es que requiere mucho más tiempo de cómputo que RSA. [29] Además, los mensajes están firmados por la clave privada del firmante y las firmas son verificadas por la clave pública correspondiente del firmante . La firma digital proporciona autenticación de mensajes , integridad y no repudio . [30]

También tenemos el algoritmo DH (Diffie-Hellman), un protocolo de establecimiento de claves entre partes que no han tenido contacto previo, utilizando un canal inseguro. El sistema se basa en la idea de que dos interlocutores pueden generar conjuntamente una clave compartida sin que un intruso, que esté escuchando las comunicaciones, pueda llegar a obtenerla. Para ello se eligen dos números públicos y, cada interlocutor, un número secreto. Usando una fórmula matemática, que incluye la exponenciación, cada interlocutor hace una serie de operaciones con los dos números públicos y su número secreto. A continuación los interlocutores se intercambian los resultados de forma pública. En teoría revertir esta función es tan difícil como calcular un logaritmo discreto. [31]

La criptografía de curva elíptica (ECC) es una aproximación a la criptografía de clave pública basada en la estructura algebraica de las curvas elípticas sobre campos finitos. El principal beneficio prometido por la criptografía de curva elíptica es un tamaño de clave más pequeño, donde un grupo de curva elíptica podría proporcionar el mismo nivel de seguridad que ofrece un sistema basado en RSA con un módulo grande y una clave correspondientemente mayor como por ejemplo, una clave pública de curva elíptica de 256 bits debería proporcionar una seguridad comparable a una clave pública RSA de 3072 bits. [32]

Por un lado existe una modificación del algoritmo DSA, llamada ECDSA (Elliptic Curve Digital Signature Algorithm), que emplea operaciones sobre puntos de curvas elípticas en lugar de las exponenciaciones que usa DSA. La principal ventaja de este esquema es que requiere números de tamaños menores para brindar la misma seguridad que DSA o RSA.[33]

Por otro lado, también existe una modificación del algoritmo DH, ECDH (Elliptic-curve Diffie–Hellman), un protocolo de acuerdo de clave anónimo que permite a dos partes, cada una con un par de clave pública-privada de curva elíptica, establecer un secreto compartido sobre un canal inseguro. Dicho secreto, es un dato conocido solo por las partes involucradas, que puede ser una contraseña. [34] [35]

Como en todo sistema de clave pública, cada usuario posee dos claves de cifrado: una pública y otra privada. Cuando se quiere enviar un mensaje, el emisor busca la clave pública del receptor, cifra su mensaje con esa clave, y una vez que el mensaje cifrado llega al receptor, este se ocupa de descifrarlo usando su clave privada.

Generación de Claves Asimétricas

Antes de nada, hay que tener claro que comandos son los más importantes y actualizados para realizar las operaciones correspondientes a cada algoritmos.

genpkey

El comando genpkey genera una clave privada.

-genparam

Genera un conjunto de parámetros en lugar de una clave privada. Si se utiliza, esta opción debe preceder a cualquier opción de algoritmo (-algorithm alg).

-paramfile filename

Algunos algoritmos de clave pública generan una clave privada basada en un conjunto de parámetros como por ejemplo . Se pueden suministrar utilizando esta opción.

-pkeyopt opt value

Con este comando se puede especificar el número de bits de clave pública que se va generar usando un determinado algoritmo.

-algorithm alg

Algoritmo de clave pública para usar como RSA, DSA o DH. Si se usa esta opción debe preceder a cualquier opción -pkeyopt.

-outform DER | PEM

Especifica el formato de salida DER o PEM. El formato predeterminado es PEM.

-out filename

Archivo de salida generado.


pkey

Se utiliza para la manipulación tanto de claves públicas como privadas. Por ejemplo, para extraer la clave pública de la clave privada.

-inform DER|PEM

Esto especifica el formato de entrada DER o PEM. El formato predeterminado es PEM.

-outform DER|PEM

Esto especifica el formato de salida.

-in filename

Esto especifica el nombre del archivo de entrada.

-out filename

Esto especifica el nombre del archivo de salida para escribir una clave

-pubin

Por defecto, se lee una clave privada del archivo de entrada: con esta opción, se lee una clave pública en su lugar.

-pubout

De forma predeterminada, se genera una clave privada: con esta opción, se generará una clave pública en su lugar.


pkeyutl

Se usa para realizar operaciones de clave pública utilizando cualquier algoritmo compatible.

-in filename

Especifica el nombre del archivo de entrada

-out filename

Especifica el nombre del archivo de salida

-inkey file

Archivo que por defecto debería ser una clave privada.

-pubin

El archivo de entrada es una clave pública.

-sigfile file

Archivo de firma, requerido solo para verificar operaciones.

-sign

Firma el fichero de entrada. Se requiere de una clave privada.

-encrypt

Cifra los datos de entrada.

-decrypt

Descifra los datos de entrada

-derive

Deriva un secreto compartido usando un par de claves.

-peerkey file

El archivo donde se encuentra la clave pública del otro usuario, utilizado por las operaciones de derivación de claves.

-verify

Verifica los datos de entrada (que deben ser un hash) comparándolos con el archivo de firma e indica si la verificación se realizó correctamente o no.

-pkeyopt opt value

Opciones de clave pública especificadas.


genrsa

Comando para generar una clave privada RSA. Este comando queda obsoleto y se utiliza "genpkey".


rsa

Se utiliza para la manipulación de claves RSA. Este comando queda obsoleto y se utiliza "pkey".


dsaparam

Se utiliza para manipular o generar archivos de parámetros DSA. Este comando queda obsoleto y se utiliza "genpkey -genparam".

A partir de estos comandos, podremos comenzar a realizar ejemplos con los diferentes algoritmos nombrados anteriormente.

RSA

En este ejemplo, se generará un par de claves asimétricas RSA de 2048 bits.

Paso 1

Se crea el par de claves (pública y privada) en un fichero que se llamará "privadoRSA.pem" cifrado con AES256. Además, estará en formato PEM (formato de archivo empleado para almacenar certificados digitales).

openssl genpkey -algorithm RSA -aes256 -out privadoRSA.pem -pkeyopt rsa_keygen_bits:2048

.............................................................................................................+++++
.......................................................................+++++
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:

Nota: Otra manera de generar un par de claves RSA sería la siguiente (obsoleto):

openssl genrsa -aes256 -out privadoRSA.pem 2048

Paso 2

Para ver el contenido del fichero creado que contiene la clave privada se realiza un "cat".

cat privadoRSA.pem

-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFLTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIzgqJ6uIcHCUCAggA
MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBAqkESJ+5bfHBdYvwTZFGW3BIIE
0LskJiiJAihpTJCsEOPKMqTh6r+XyNQTAoVtkKQ31d63dbe2vpIP7RfCNYNCcDRQ
Vyqpt/YN83ltkQ46tuh68NzyT2oUa/LS5I34xj9ABI7CLD2XqQWZ6kTPakgRYaKb
WwEV0WhXCFLkiX+kAHWX+LcfR9s/DyCRpNzxwBjJAvysolhWx0gBjc0R5aEOtQqt
E5ErEcsYX+iPJUMIEVtrKy3PIB9doqGlSG45ZFC8NSu8tDizrBvVicbnT/2jsJb5
IThcfIEQZp9X31tRN/OmnxARhNtRn2YW+9/dTBOlLXPJ/Ikdm0kx6JHMbfw/hH8S
+3HP7p5W5wGe6xwhAb1soD3ZPXDpu76zTLmv4IoXu2kuamNNNGUqpDDG3OT54QsR
dtBn8jUhR+niWB2uBGSZ902+Ru+VY0M42SjVYAb83EoAB86HyG6XAKmJRBmzXZfh
Qmk8svfC1n6+7vv5MUaqTTRsqeTwGu4jenOTEVjHUyKQamMak4F83oV/4wFsuK5V
y7VfVv3DkCy9/CJVdmS3ZHc4V5D741VLc8keNKhH17rShbNHE+lFlrLzA7YwRdw4
lpEbaoLxzjz/yB2LKjoWRbngpxcB7/qz1NkObm3S2ROWcRDi5hNHEc0ctlT0kuXi
KSG6Sqlald9bast1zmMpIpvvfKVG3moq2umVR1B2JhwYRmdKEsJ7NjioI7pmuZc4
fr485I1SDBGjhSmsQAdUq5b7aljCbgrSLjHYFVxWLOutfhE1P3E7sgiUWlQmvZWP
qLygQUFBKE9Q/WjRR3cN4WOFDIE3wVpE8uejkDy++pbGV2xb7mQG+77S3lWvtdDp
5Zu4qDl0daZjAP6W/636aBqiQbGvFM1Ch0+UNyYie9vh7zjX5K3viGiUHW1yb9+o
QQfpgIIODz7X3bk6kQBS5j+xDAx+oKAw0sxlTGqp5hX6nPP9/LI7XeCeWQdAV/ls
G5q8UjVDKyKjBQUWftnRDpoUnCOSTschFifktDInHrSaVetaWn5yFs/cx+DAE2xa
wRJn6k8gXhk72ytTqd64BLw3evZMPnaldEhMGle44ZYf7cebL8RhKDEgoT99DLKU
1TIiOzsMz+nzkI0t8U6nsF+pEpWuOjPP4lPSOqhAbwGMIdTgvtWSmLBJzdQ0uP85
Vo6Gez8mgjcFh39VGuq2WmkY6hkmiodpv2IjFBUAkC4vrGh1E/NQGIBWj/5HwDiy
iA+gw/mQts2eDQw00UbpCAXDuxIsmLwc5HI/gmiXxx82H1ZtGxljrut3vMotukKf
4gr+T4umvvEl/3/uGGEMT/WQySoso/47JS9tPiogA6D+GFJ2AZA1XsPuvuZ/WPWI
RbUlgOrVbq4a+7LBC/tzC28hSDF+VRdAT3FoiS2HXXFJYrCMCjmTFz3YTnKc6U/k
k1rfuoMLnFMimy+tR14zMuH6Dxu+SDFj862cZeMrQOAaplnGpxDiO37u8CKXaQJ7
JpiK5n2mrkSZ6RHM4m5VZeSJNSTtxJbs/3kaJZQLJ1e2wufD3Rzy05VKdQSyFjU9
J+D3spLNvz72gAvZJGLdP5BT/uIfAI40vvNx5csei9kqTQ2QLoL5bpvmV+d4uz6D
1RNVIYJ4cAkg5AjRpP6kGWHGCx1GTc0MD34mCwNNW/ll
-----END ENCRYPTED PRIVATE KEY-----
Paso 3

Se extrae la clave pública del fichero "privadoRSA.pem", esta clave es la que se distribuye a las personas o entidades. Cuando la otra parte quiera enviar un mensaje, lo cifrará con esta clave para que posteriormente el destinatario lo descifre con su clave privada. La clave pública la contendrá el fichero "publicaRSA.pem" y para su extracción se usará "-pubout".

openssl pkey -in privadoRSA.pem -pubout -out publicaRSA.pem

Enter pass phrase for privadoRSA.pem:

La contraseña es la misma con la que se protegió la clave privada.

Nota: Otra manera de generar extraer la clave pública sería la siguiente (obsoleto):

openssl rsa -in privadoRSA.pem -pubout -out publicaRSA.pem

Paso 4

Para ver el contenido del fichero creado que contiene la clave pública se realiza un "cat".

cat publicaRSA.pem

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvXck+2msWq8LEhX/AwJB
7hIZvW+QwpODVU5RkfFEk+8L2IPK+BWM6gMZO6HfQqn8yjkjAHTEY/RlBSGaCX1V
AA5V3RQs4SBbcQAFo0tBpqhTUw36Se9sozaxnN4kObTZxvFmzX3BqtKzbZP33/og
RgKELBpe43GTDkhQtfWpCzGQRiGodFBLBPQ7HibdKB+RK/3wTftUOgriabb5HSdI
9ySyrkvykEheRHgFe6XUo6gU3BWA1h276wXqdw2TiJ+VR/GX8tzXGV1RSthxqNpW
2/EpGOV12vRz9MnTEdt2Rfmx9x3VzMrxjiXSK97xpWXlqmoRCj+cdb1xvD05vVcG
MwIDAQAB
-----END PUBLIC KEY-----

DSA

En este ejemplo, se generará un par de claves asimétricas DSA de 2048 bits.

Paso 1

Se genera el fichero que contendrá los parámetros DSA en dsa.params.pem usando"-genparam". Además se añade "-pkeyopt"para especificar el tamaño en bits (2048).

openssl genpkey -genparam -algorithm DSA -out dsa.params.pem \ > -pkeyopt dsa_paramgen_bits:2048

.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
...............+...........+......+............+.........+..........
...........+..+...............+...............................+.....
....+....+.......+.+............................+.............+..+..
+............+.......................+.....+..............+......+..
..+.+..........+......+...................+..+.+....+...+...........
.................................................+............+.....
+..+..................................+.......+.+..+..............+.
.+.......+.............+...........+......+...........+..+....+.....
......+.....+.........+.................+...+......+...............
............+....+............+.........+.+.+........+.......+....+.
.......+.................................+.+......+..+...+....+......
...+.+.+..+........+......+.............+...........+.+..+.+.........
.........+.....+...+......+..........+..+...............+.......+.+.
...+......+..........................................+............+.
.............+...............+.............+.......+.................
...+....+......+.+...+.....+.+.........+....................+........
.............+.........+.......+...+.................++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++*

Nota: Otra manera de generar los parámetros DSA sería la siguiente (obsoleto):

openssl dsaparam -outform PEM -out dsa.params.pem 2048

Paso 2

Para ver el contenido del fichero creado se ejecuta un "cat".

cat dsa.params.pem

 
-----BEGIN DSA PARAMETERS-----
MIICIAKCAQEAhRIR6kI6+G+0+ruDK8v0BfYLAtBmm5nIePn4hJzUTTgTzXPjJKg0
Q/oJciPw3/guyXIEHZD/JDBoiBM1VByGwyes9L9JeHWnP3u0lhoyeIGlYchSKu/X
mW5c0vvVa6TMWTH+Y9oVzS8f0iRLiSzZCytsAz54TP87uGt231Pwvh2XyotYOh6U
lQB7m0DiocDtFjVmi5v0ZdclxN9/1bwEz3q/CtwqfNP5uBCzuR2h2Om0Vo1ctAr4
1U0E8oXRmW7jVTdSej4MQ1VqPNv9xs7gZRpCIV/3XWJP0g4PPAHSFv5+xiVOrpFB
UW7bjoP+BEH880G7JxnV3Q+U1SYuFEmGqwIVAMpBJ7V1B/jHAIAS2OpO+DiUHy+5
AoIBAGtACSNtaf2mzdVHLU0+D/LeM7cjisGtHwR7ZBmsd9WJ7xMOS6s0B8rgCWXq
5bIgtJZBYkZUG+sxyoLAe7t2lwCNsl0jfJ13ZVU+WWPzHGo5JXayTLYFCHDWGdKG
8ioKSBjsJv3qgxoUNw1Cp/4u3oA/0YpUUOTIgWCzLLsKWE5sPMZJA5uC60pZHdU9
U42+8sLkIxxlFO/FgOWIotMrULfFQhpxCbUvAllP9wKsW6sJuN+QMUrBtLITBJGc
f+x8/oQ57mNcUpO8j/LMwjxM17BkqAPsFgbxO+DP5mVzLKk2/rzLOe9afiyW+H5E
XCRUWsKwuCbNW283UHMLgcBdsZg=
-----END DSA PARAMETERS-----
Paso 3

Generamos la clave privada a partir del fichero "dsa.params.pem" cifrado con AES256. Se deberá introducir una contraseña con la que protegeremos la clave.

openssl genpkey -aes256 -paramfile dsa.params.pem -out private.pem

 
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:

Nota: Otra manera de generar la clave privada a partir del fichero de parámetros DSA sería la siguiente (obsoleto):

openssl gendsa -aes256 -out private.pem dsa.params.pem

Paso 4

Para ver el contenido del fichero creado que contiene la clave privada se realiza un "cat".

cat private.pem

-----BEGIN ENCRYPTED PRIVATE KEY-----
MIICvTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQISAJFHx6O9lwCAggA
MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBC6Kp0K/WzT6fuRnEPpFTSSBIIC
YDE9CRb36TVvxQ1LD8yV7u8Y+5jUQ+cpTn8m7TXogA3umuQ0/Q8qmp0LLOhMEhgT
ngcapbOqzYzzeAYhaRD0XNJh4D0B8WydbX2LI62b8mhM8SAtemkrFfqmf6+atuHD
nbojPMuvJu3/iaNw2OUDm508Zu4ZeRz+iwJMrlMnJx1yFfwBWWsNAIM/j4E7ansl
YLYtS/Kz8YjLALX+mLLcMrl7YjdojoDxpY6pP+47nsiyErdt1CRa44qEx69OUT4E
yhZXhHG711VemJi2ktskMP3K3bzkUXGNco/RK9Tx/sENuqE65FBumKBKp4pNWYv4
YCMh7eIGvcwL/xsrrkEY/dRept4BHnCZ2ZrqQsuvK6aZIxJ864PwTKNIpSQ2RDDc
GJu5S4z94YrZGLtY3UU1l+D7ExpERuO8cBuzaotPQjQbmxNvN0/3/NqAC7BNlMh0
LyQE3Ph2W4IkfdX5dg3CNitcHFFCT/wIS4xqUNJk5MZ5GBB8dVzzOHrpzXq3LZ6t
1PlzCyECyK6g6Yk6fbjvO7rya2wkYsGfoeqmkwAx9pWxfiRQGPwWmqTm2nk4TTWg
SNKlxCdBMUUt/c5CXgL3+3TNK2H4yY5/UQlMF19RN47lLHsS4rWkKaHg+NSO+CB0
5EeH26xu4zFmlLkuKsTjvoV0T1LGqVb/3jxcy+gzO1BTi/FP6WnRuY9OrECHvWs6
MeJY3kI6/Tth/Ze274LiwJAxMlAhNWtA/1WtnZHhKol9WnbQOLV5oNCXK4fMwhbu
fBqcEZcWR6fBT956IY3TKpnDccGcBv3k2bFY5A3NoKdm
-----END ENCRYPTED PRIVATE KEY-----
Paso 5

Extraemos la clave pública a partir del fichero "private.pem"

openssl pkey -in private.pem -pubout -out public.pem

Enter pass phrase for private.pem:

La contraseña que hay que introducir es la misma con la que se protegió la clave privada.

Nota: otra forma de extraer la clave pública a partir de la privada es la siguiente (obsoleto):

openssl dsa -in private.pem -outform PEM -out public.pem -pubout

Paso 6

Para ver el contenido de la clave pública hacemos un "cat".

cat public.pem

-----BEGIN PUBLIC KEY-----
MIIDOjCCAi0GByqGSM44BAEwggIgAoIBAQCFEhHqQjr4b7T6u4Mry/QF9gsC0Gab
mch4+fiEnNRNOBPNc+MkqDRD+glyI/Df+C7JcgQdkP8kMGiIEzVUHIbDJ6z0v0l4
dac/e7SWGjJ4gaVhyFIq79eZblzS+9VrpMxZMf5j2hXNLx/SJEuJLNkLK2wDPnhM
/zu4a3bfU/C+HZfKi1g6HpSVAHubQOKhwO0WNWaLm/Rl1yXE33/VvATPer8K3Cp8
0/m4ELO5HaHY6bRWjVy0CvjVTQTyhdGZbuNVN1J6PgxDVWo82/3GzuBlGkIhX/dd
Yk/SDg88AdIW/n7GJU6ukUFRbtuOg/4EQfzzQbsnGdXdD5TVJi4USYarAhUAykEn
tXUH+McAgBLY6k74OJQfL7kCggEAa0AJI21p/abN1UctTT4P8t4ztyOKwa0fBHtk
Gax31YnvEw5LqzQHyuAJZerlsiC0lkFiRlQb6zHKgsB7u3aXAI2yXSN8nXdlVT5Z
Y/McajkldrJMtgUIcNYZ0obyKgpIGOwm/eqDGhQ3DUKn/i7egD/RilRQ5MiBYLMs
uwpYTmw8xkkDm4LrSlkd1T1Tjb7ywuQjHGUU78WA5Yii0ytQt8VCGnEJtS8CWU/3
Aqxbqwm435AxSsG0shMEkZx/7Hz+hDnuY1xSk7yP8szCPEzXsGSoA+wWBvE74M/m
ZXMsqTb+vMs571p+LJb4fkRcJFRawrC4Js1bbzdQcwuBwF2xmAOCAQUAAoIBACzq
kTPSyHX1OXML7HLdSTBkQtIvjl0OoMLYdD21dCgPSVygzPmqyEWAoUGdp5AY5isY
eTtwocGLWFLk20qqJ8PfQ6WAp2YswxLS8dZhWPbGM4g3z2mquDX4/nOHOXL8y5f/
ME2JiUCeleuh3uZXLIP9tGXV0MpmyKWow9mAHmfdsIft5eQqMD+0fPtY3kZXRw9S
cwhvXnMpeoa2hZt7s5rm1n8Q0eGozEACjdmil+NSNbXHDsbsgYQUwfRy2+9j6DnP
Vh3Az6x9jR/zzKekuXPhGQCNNshLgRdmuSJTiHoEK2H5Z7XczL4M0xFylrcS5A72
/p+j4tQ/DoR/P6INFIk=
-----END PUBLIC KEY-----

DH (Diffie-Hellman)

En este ejemplo, se generará un par de claves asimétricas DH.

Paso 1

Generamos un conjunto de parámetros DH:

openssl genpkey -genparam -algorithm DH -out dh.params.pem

..............+...............+..............................+.............
..................................................+................+.......
....................................................+......................
......................................+..................+......+..........
.....................................................+.....................
....+.....................+.........................+......+...............
..........+........+..................++*++*++*++*++*
Paso 2

Para ver el contenido del fichero creado se ejecuta un "cat".

cat dh.params.pem

 
-----BEGIN DH PARAMETERS-----
MIGHAoGBAPAPLs7hB1hTlQEbANW7EG4+jGJ5MtjcOA3Q5heR6m7T5r9QXaetH7cK
9reMSDJAFBFPqlc36ogzIaxOHYhGy3wmsBPYKbKO1Ljld/5XmAJLwp+OaT5gmmmI
OJ0UPl2cUv4rzaZGXxQcMEwy/2aQgpTSpBjpoBuNmJPEiPLoPi57AgEC
-----END DH PARAMETERS-----
Paso 3

Generamos la clave privada a partir del fichero "dh.params.pem" cifrado con AES256. Se deberá introducir una contraseña con la que protegeremos la clave.

openssl genpkey -aes256 -paramfile dh.params.pem -out privateDH.pem

 
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
Paso 4

Para ver el contenido del fichero creado que contiene la clave privada se realiza un "cat".

cat privateDH.pem

-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIBjTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIWxTxGZ6e1EACAggA
MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBAGMSzeSmksb4V8alSUWSN6BIIB
MM655NUrf1fLjSlSi69/yGcFISKA73OaGXO8JrFfvDi95Ig/Yf18BO+otT0iKMvX
dQav/XEfyBofeJERZiILq9A7uzJ9sWAPZcrLiyqTQQP6hPhGEr8s7l05ExWg0rtX
TGXZfqVWTyzBOEuJ56GVdEcg2NYZv0sBpnrnP+LoJugl7oKhMP97MEChusSu6UQ+
7vGaFkPOI9hQ4OxY5PfmylhYYfGwVF2oBI4hnzKJq4B81KrG+axo2MDOhWBpHD/z
zVIzTfYLCNiG+5hKXt4e7wT/CBxUUGXfxpjcP/OJN+wwUe7uRtrRMsWagJYEh1KC
2APuyIrGagPWx02lrunSaAad6feGvx1g/q3LzqCEiDGoc5pnuTf0SI2gGHEnlV0T
tF30hVobMvlzaqx5gdDnX14=
-----END ENCRYPTED PRIVATE KEY-----
Paso 5

Extraemos la clave pública a partir del fichero "privateDH.pem"

openssl pkey -in privateDH.pem -pubout -out publicDH.pem

Enter pass phrase for privateDH.pem:

La contraseña que hay que introducir es la misma con la que se protegió la clave privada.

Paso 6

Para ver el contenido de la clave pública hacemos un "cat".

cat public.pem

-----BEGIN PUBLIC KEY-----
MIIBHzCBlQYJKoZIhvcNAQMBMIGHAoGBAPAPLs7hB1hTlQEbANW7EG4+jGJ5Mtjc
OA3Q5heR6m7T5r9QXaetH7cK9reMSDJAFBFPqlc36ogzIaxOHYhGy3wmsBPYKbKO
1Ljld/5XmAJLwp+OaT5gmmmIOJ0UPl2cUv4rzaZGXxQcMEwy/2aQgpTSpBjpoBuN
mJPEiPLoPi57AgECA4GEAAKBgDsIgvkf1EAotwaUC7MtPhcExAy4w8xtXNfr1gIm
I4HJ5zUe3RIUEO5jZDIZcs1HjAB1LF8YHEcZ7rnCCHIABTW5faohD9juR4XYhOhn
1VfVeyPSjd4Wet5WgfWUX30S2IHS0her/pakV63GsQ5qGbrUUziFFLS2vubzeaWM
3pIZ
-----END PUBLIC KEY-----

EC (Elliptic curve) [36]

OpenSSL proporciona dos potentes herramientas de línea de comando para trabajar con claves adecuadas para algoritmos de curva elíptica (EC):

openssl ecparam
openssl ec

Los únicos algoritmos de curva elíptica que actualmente soporta OpenSSL son Elliptic Curve Diffie Hellman (ECDH) para el acuerdo de clave y el algoritmo de firma digital de curva elíptica (ECDSA) para la firma / verificación.

Formatos de archivo de clave privada EC

Por defecto, OpenSSL funcionará con archivos PEM para almacenar claves privadas de EC. Estos son archivos de texto que contienen datos codificados en base 64. Un archivo con la extensión ".pem" tendrá un aspecto similar a:

-----BEGIN EC PRIVATE KEY-----
MIIBIAIBAQQYd8yhaE899FaH3sw8aD4F/vtpMVBLfVqmoIHKMIHHAgEBMCQGByqG
SM49AQECGQD////////////////////+//////////8wSwQY////////////////
/////v/////////8BBgiEj3COVoFyqdCPa7MyUdgp9RiJWvVaRYDFQDEaWhENd6z
eMS2XKlZHipXYwWaLgQxBH0pd4EAxlodoXg3FliNziuLSu6OIo8YljipDyJjczcz
S0nctmptyPmXisp2SKlDsAIZAP///////////////3pi0DHIP0KU9kDsEwIBAaE0
AzIABBsl8ZSGJqcUpVoP8zekF92DGqDBMERcHhCXmgPXchP+ljybXbzYKINgxbp5
0g9/pw==
-----END EC PRIVATE KEY-----

O si el arvhivo está cifrado tendrá un aspecto similar a:

-----BEGIN EC PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,258248872DB25390

JIzhns0nRb+pj6RONAijJli8Rhu2bIrw8D+ruHEWL1IEH6Q5tvzqAI2PDYXbSzCn
24JPWx9khmTu6ijerANNYYk0p2Pjxr12MAYpqgtXbRrXLF4AIomzYWq16BH7Y63o
zvqWMBJO6tQ5RHPLM2FmweyPB/XSL7KvLTe+g6pz/W9wf52CyQ/VeK+yBXqEi7QF
0f9EKRlePRLAUcQPD4nkckcywX6Nz+TW/SOKt38YytM9MyQsAfcxu7u0nl/dLylk
n57qUm3nk0z0moYJbfLx59eP0/go8VjeP2fRKkgz1DOM7VkmtPrC7vnyRpKsnP2S
6n6uacerkNXTmUcz7mTCGGfrsBeACJeX1gwinDZVwkzDxNKhLXOlFFAMWE+SeiFp
kDny2v3D8sU=
-----END EC PRIVATE KEY-----

También puede encontrar claves privadas de formato PKCS8 (procesa las claves privadas en formato PKCS#8) en archivos PEM. Los archivos de clave privada PKCS8, como los anteriores, pueden contener muchos tipos diferentes de clave privada, no solo claves EC.

Se puede pasar de un formato a otro si lo desea. Todos los comandos de conversión pueden leer las formas cifradas o no cifradas de los archivos, sin embargo, se debe especificar si desea que la salida esté cifrada o no. Para convertir un archivo PKCS8 a un formato EC cifrado tradicional use:

openssl ec -aes-128-cbc -in p8file.pem -out tradfile.pem

El primer argumento se puede reemplazar por "aes-128-cbc" con cualquier otro nombre de cifrado válido openssl. Para convertir un archivo PKCS8 a un formato EC sin cifrar tradicional, simplemente omitimos el primer argumento:

openssl ec -in p8file.pem -out tradfile.pem

O para convertir de un formato EC tradicional a un formato PKCS8 cifrado hacemos lo siguiente:

openssl pkcs8 -topk8 -in tradfile.pem -out p8file.pem

O para un formato PKCS8 no cifrado hacemos lo siguiente:

openssl pkcs8 -topk8 -nocrypt -in tradfile.pem -out p8file.pem

Tener en cuenta que, de manera predeterminada (extensión ".pem"), los archivos de clave privada de EC no están cifrados (debe declarar explícitamente que el archivo debe estar cifrado y qué cifrado usar), mientras que para los archivos PKCS8 ocurre lo contrario. El valor predeterminado es cifrar: se debe indicar explícitamente que no desea que se aplique el cifrado, utilizando la opción "-nocrypt".

Además del formato PEM, todos los tipos de archivos de claves anteriores también se pueden almacenar en formato DER. Este es un formato binario y, por lo tanto, no es directamente legible para humanos, a diferencia de un archivo PEM. Un archivo PEM contiene datos DER codificados utilizando reglas de codificación base 64 con un encabezado y un pie de página agregados. A menudo es más conveniente trabajar con archivos PEM por este motivo.

Los comandos de openssl suelen tener las opciones "-inform DER" o "-outform DER" para especificar que el archivo de entrada o salida es DER respectivamente. Entonces, por ejemplo, el comando para convertir un archivo PKCS8 a un formato EC cifrado tradicional en DER se hace lo mismo que antes, pero añadiendo "-outform DER":

openssl ec -in p8file.pem -outform DER -out tradfile.der

Tenga en cuenta que no puede cifrar un formato tradicional de clave privada de EC en formato DER (y, de hecho, si intenta hacerlo, el argumento se ignorará silenciosamente). De igual forma esto no ocurre para los archivos PKCS8, pueden estar cifrados incluso en formato DER. Así, en el siguiente ejemplo se convertirá un archivo de clave de formato tradicional en un formato PKCS8 cifrado y a su vez, en formato DER.

openssl pkcs8 -topk8 -in tradfile.pem -outform DER -out p8file.der
Formatos de archivo de clave pública EC

Las claves públicas de EC también se almacenan en archivos PEM. Una clave pública típica de la EC tiene el siguiente aspecto:

-----BEGIN PUBLIC KEY-----
MEkwEwYHKoZIzj0CAQYIKoZIzj0DAQMDMgAE+Y+qPqI3geo2hQH8eK7Rn+YWG09T
ejZ5QFoj9fmxFrUyYhFap6XmTdJtEi8myBmW
-----END PUBLIC KEY-----

Este formato se utiliza para almacenar todos los tipos de claves públicas en OpenSSL, no solo las claves EC.

Es posible crear un archivo de clave pública a partir de un archivo de clave privada, aunque no al revés:

openssl ec -in ecprivkey.pem -pubout -out ecpubkey.pem

Como se dijo en el apartado anterior, una versión codificada en DER puede crearse usando "-outform DER":

openssl ec -in ecprivkey.pem -pubout -outform DER -out ecpubkey.der
Generando claves y parámetros de EC

Un archivo de parámetros de EC contiene toda la información necesaria para definir una curva elíptica que luego se puede usar para operaciones criptográficas (es decir, para ECDH y ECDSA). OpenSSL contiene un gran conjunto de curvas predefinidas que se pueden usar. La lista completa de curvas incorporadas se puede obtener a través del siguiente comando:

openssl ecparam -list_curves

Un archivo de parámetros EC se puede generar para cualquiera de las curvas con nombre incorporadas de la siguiente manera:

openssl ecparam -name secp256k1 -out secp256k1.pem

Se puede reemplazar secp256k1 por cualquier curva de la lista.

Las claves se pueden generar desde el comando ecparam, ya sea a través de un archivo de parámetros preexistentes o directamente seleccionando el nombre de la curva. Para generar un par de claves privadas / públicas a partir de un archivo de parámetros preexistente use lo siguiente:

openssl ecparam -in secp256k1.pem -genkey -noout -out secp256k1-key.pem

O para hacer la operación equivalente sin un archivo de parámetros, use lo siguiente:

openssl ecparam -name secp256k1 -genkey -noout -out secp256k1-key.pem

La información sobre los parámetros que se han utilizado para generar la clave se incrusta en el propio archivo de clave.

De forma predeterminada, al crear un archivo de parámetros o al generar una clave, openssl solo almacenará el nombre de la curva en los parámetros generados o el archivo de clave:

openssl ecparam -in secp256k1.pem -text -noout

Esto simplemente confirmará el nombre de la curva en el archivo de parámetros imprimiendo lo siguiente:

ASN1 OID: secp256k1

Si desea examinar los detalles específicos de los parámetros asociados a una curva con un nombre particular, se puede lograr de la siguiente manera:

openssl ecparam -in secp256k1.pem -text -param_enc explicit -noout

El comando anterior muestra los detalles de una curva desde un archivo, pero esto también se puede hacer directamente usando el argumento "-name" en lugar de "-in". La salida se verá similar a la siguiente:

Field Type: prime-field
Prime:
    00:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:
    ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:fe:ff:
    ff:fc:2f
A:    0
B:    7 (0x7)
Generator (uncompressed):
    04:79:be:66:7e:f9:dc:bb:ac:55:a0:62:95:ce:87:
    0b:07:02:9b:fc:db:2d:ce:28:d9:59:f2:81:5b:16:
    f8:17:98:48:3a:da:77:26:a3:c4:65:5d:a4:fb:fc:
    0e:11:08:a8:fd:17:b4:48:a6:85:54:19:9c:47:d0:
    8f:fb:10:d4:b8
Order: 
    00:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:
    ff:fe:ba:ae:dc:e6:af:48:a0:3b:bf:d2:5e:8c:d0:
    36:41:41
Cofactor:  1 (0x1)

Se pueden generar parámetros y archivos de claves para incluir los parámetros explícitos completos en lugar de solo el nombre de la curva, si se desea. Esto podría ser importante si, por ejemplo, no todos los sistemas de destino conocen los detalles de la curva mencionada. En la versión 1.0.2 de OpenSSL, se han agregado nuevas curvas con nombre, como brainpool512t1. Intentar usar un archivo de parámetros o clave en versiones de OpenSSL menores a 1.0.2 con esta curva resultará en un error:

bash$ openssl ecparam -in brainpoolP512t1.pem -text -noout
unable to load elliptic curve parameters
140138321110720:error:1009E077:elliptic curve routines:EC_ASN1_PKPARAMETERS2GROUP:ec group new by name failure:ec_asn1.c:1035:
140138321110720:error:1009107F:elliptic curve routines:d2i_ECPKParameters:pkparameters2group failure:ec_asn1.c:1080:
140138321110720:error:0906700D:PEM routines:PEM_ASN1_read_bio:ASN1 lib:pem_oth.c:83:

Este problema puede evitarse si se usan parámetros explícitos en su lugar. Así que bajo OpenSSL 1.0.2 podría crear un archivo de parámetros como este:

openssl ecparam -name brainpoolP512t1 -out brainpoolP512t1.pem -param_enc explicit

Mirando el archivo de parámetros notará que ahora es mucho más largo:

-----BEGIN EC PARAMETERS-----
MIIBogIBATBMBgcqhkjOPQEBAkEAqt2duNvpxIs/1OauM8n8B8swjbOzydIO1mOc
ynAzCHF9TZsAm8ZoQq7NoSrmo4DmKIH/Ly2CxoUoqmBWWDpI8zCBhARAqt2duNvp
xIs/1OauM8n8B8swjbOzydIO1mOcynAzCHF9TZsAm8ZoQq7NoSrmo4DmKIH/Ly2C
xoUoqmBWWDpI8ARAfLu8+UQc+rduGJDkaITq4yH3DAvLSYFSeJdQS+w+NqYrzfoj
BJdlQPZFAIXy2uFFwiVTtGV2NokYDqJXGGdCPgSBgQRkDs5cEniHF7nBugbLwqb+
uoWEJFjFbd6dsXWNOcAxPYK6UXNc2z6kmap3p9aUOmT3o/Jf4m8GtRuqJpb6kDXa
W1NL1ZX1rw+iyJI3bISs4btOMBm3FjTAETEVnK4DzunZkyGEvu8ha9cd8trfhqYn
MG7P+W27i6zhmLYeAPizMgJBAKrdnbjb6cSLP9TmrjPJ/AfLMI2zs8nSDtZjnMpw
MwhwVT5cQUypJhlBhmEZf6wQRx2x04EIXdrdtYeWgpypAGkCAQE=
-----END EC PARAMETERS-----

Los parámetros completos se incluyen, en lugar de solo el nombre. Esto ahora puede ser procesado por versiones de OpenSSL anteriores a 1.0.2. Así que bajo 1.0.1:

openssl ecparam -in brainpoolP512t1.pem -text -noout

Esto mostrará correctamente los parámetros, aunque esta versión de OpenSSL no conoce esta curva.

Lo mismo ocurre con los archivos de clave. Entonces para generar una clave con parámetros explícitos:

openssl ecparam -name brainpoolP512t1 -genkey -noout -out brainpoolP512t1-key.pem -param_enc explicit

Este archivo de claves ahora puede ser procesado por versiones de openssl que no conocen la curva de Brainpool.

Sin embargo, se debe tener en cuenta que una vez que los parámetros se han convertido del formato de nombre de curva a parámetros explícitos, no es posible volver a cambiarlos, es decir, no hay una utilidad para tomar un conjunto de parámetros explícitos y determinar a que curva está asociada.

Cifrado Asimétrico

RSA

Como sabemos, el cifrado asimétrico sólo se puede aplicar a "cosas pequeñas" como claves simétricas o resúmenes. Cualquier intento de cifrar con RSA un fichero normal, de más de 200 caracteres, producirá un error de tipo "input too long". El envío confidencial de ficheros normales exige el empleo de sistemas mixtos, en los que el fichero se cifra con una clave simétrica (o contraseña) y esa contraseña es cifrada mediante RSA con la clave pública del receptor y así es enviada a dicho receptor, junto con el fichero cifrado. Si además se desea verificar la integridad del envío, se añade un resumen firmado (que a su vez es un cifrado con clave privada del emisor) del fichero original.

Por tanto, desarrollamos un ejemplo en el que el emisor (Alice) envia a Bob el documento "texto.txt" cifrado en AES-256-CBC (texto.aes), el resumen SHA-256 del fichero original, cifrado con su propia clave RSA privada (firmaDoc.rsa) y la contraseña que usó para cifrar el documento, cifrada a su vez con la clave pública RSA de Bob (contraseña.cif). Antes de nada, emisor (Alice) y receptor (Bob) tendrán que haber intercambiado sus claves públicas (publicaAliceRSA.pem y publicaBobRSA.pem) y por supuesto, cada uno conserva su clave privada (privadaAliceRSA.pem y privadaBobRSA.pem).

Tarea de Alice (emisor)
Paso 1
Alice cifra con clave simétrica (AES-256-CBC) el fichero "texto.txt" con una contraseña "prueba+12" y produce "texto.aes"

openssl enc -aes-256-cbc -pbkdf2 -in texto.txt -out texto.aes

Paso 2
Alice escribe la contraseña en el fichero "contraseña.txt", veamos el contenido este fichero:
prueba+12
Paso 3
Alice cifra de forma asimétrica el fichero contraseña.txt con la clave pública RSA de Bob (fichero publicaBobRSA.pem) y produce "contraseña.cif"

openssl pkeyutl -pubin -encrypt -in contraseña.txt -out contraseña.cif -inkey publicaBobRSA.pem

Paso 4 
Alice firma con su clave privada RSA (privadaAliceRSA.pem) el resumen generado con SHA2-256 del fichero texto.txt y genera el fichero "firmaDoc.rsa". Lo más normal es que la clave privada de Alice esté cifrada y se le solicite la contraseña al ejecutar este comando.

openssl dgst -sha256 -sign privadaAliceRSA.pem -out firmaDoc.rsa texto.aes

A continuación, Alice envía a Bob los tres ficheros: texto.aes, contraseña.cif y firmaDoc.rsa

Tarea de Bob (receptor)
Paso 1

Bob recibe el mensaje con los tres ficheros de Alice y procede a descifrar la contraseña enviada por Alice (contraseña.cif) con su clave privada (privadaBob.pem) en el fichero contraseña.txt. Si la clave privada de Bob estuviese cifrada (que es lo más normal), se le solicitará la contraseña que la protege.

openssl pkeyutl -decrypt -in contraseña.cif -out contraseña.txt -inkey privadoBobRSA.pem

Al hacer un cat al archivo de salida contraseña.txt, Bob ya conoce la contraseña que Alice usó para cifrar texto.aes:

 prueba+12 
Paso 2

Una vez obtenida la contraseña de cifrado simétrica "prueba +12", Bob puede descifrar el "texto.aes" con dicha contraseña y obtener el documento original (texto.txt):

openssl enc -d -aes-256-cbc -pbkdf2 -in texto.aes -out texto.txt

Paso 3

Bob verifica que el resumen SHA-256 del texto descifrado (texto.txt) coincide con el resumen firmado en firmaDoc.rsa. Como Alice firmó el resumen (es decir, lo cifró mediante RSA con su propia clave privada), Bob usa la clave pública de Alice (publicaAliceRSA.pem) para descifrarlo. Si la comprobación es correcta, la transmisión ha tenido CONFIDENCIALIDAD (el texto viajó cifrado con una clave simétrica que viajaba cifrada con RSA) y además INTEGRIDAD (el texto descifrado coincide con el que calculó Alice y envió firmado, es decir, cifrado con su clave privada RSA).

openssl dgst -sha256 -verify publicaAliceRSA.pem -signature firmaDoc.rsa texto.txt

 Verified OK 

Nota: Sabemos que OpenSSL ofrece alternativas para casi todos los comandos. Bob podría realizar este último paso generando el resumen SHA256 del fichero texto.txt en un fichero texto.sha y utilizando el comando "openssl pkeyutl" de la misma forma que se indica en el paso 3 del ejemplo siguiente, con los cambios oportunos.

Firmado y Comprobación de Resúmenes

En este apartado se realizará la firma y verificación del resumen de un fichero "texto.txt" (utilizaremos "SHA512") que se llamará "resumen.sha".

Antes de nada, utilizaremos el comando "pkeyutl" en el primer ejemplo, dicho comando se puede usar para realizar operaciones de clave pública utilizando cualquier algoritmo compatible.

DSA

Paso 1

Realizamos el resumen del fichero "texto.txt" y lo guardamos en formato binario en el fichero de salida "resumen.sha".

openssl dgst -sha512 -binary -out resumen.sha texto.txt

Paso 2

Firmamos el "resumen.sha" con el comando "pkeyutl"y usaremos la clave privada DSA generada anteriormente. En el caso de que se haya protegido la clave con una contraseña deberemos introducirla.

openssl pkeyutl -sign -in resumen.sha -inkey private.pem -out firma.dsa -pkeyopt digest:sha512

Paso 3

Se procede a verificar que se ha firmado correctamente ejecutamos lo siguiente:

openssl pkeyutl -pubin -verify -in resumen.sha -sigfile firma.dsa -inkey public.pem

Signature Verified Successfully

Se observa que la firma ha sido exitosa.

RSA

Paso 1

Creamos el resumen y lo firmamos en la misma línea introduciendo la contraseña que protege la clave RSA. En este caso usaremos el comando "dgst".


openssl dgst -sha256 -sign privadoRSA.pem -out firma.rsa texto.txt

Paso 3

Se procede a verificar que se ha firmado correctamente usando nuestra clave pública:

openssl dgst -sha256 -verify publicaRSA.pem -signature firma.rsa texto.txt

Verified OK

Se observa que la firma ha sido exitosa.

ECDSA

Paso 1

Realizamos el resumen del fichero "texto.txt" y lo guardamos en el fichero de salida "resumen.bin".

openssl dgst -sha512 -binary -out resumen.bin texto.txt

Paso 2

Firmamos el "resumen.bin" con el comando "pkeyutl"y usaremos la clave privada ECDSA generada anteriormente. En el caso de que se haya protegido la clave con una contraseña deberemos introducirla.

openssl pkeyutl -sign -in resumen.bin -inkey secp256k1-key.pem -out firma.ecdsa -pkeyopt digest:sha512

Paso 3

Se procede a verificar que se ha firmado correctamente ejecutamos lo siguiente:

openssl pkeyutl -pubin -verify -in resumen.bin -sigfile firma.ecdsa -inkey publicsecp256k1.pem

Signature Verified Successfully

Se observa que la firma ha sido exitosa.

Derivación de claves DH

DH

A partir de los parámetros DH generados anteriormente, generaremos otro par de claves (privateDH2.pem y publicDH2.pem). De esta manera, podremos comprobar la derivación entre dos pares de claves.

Supongamos que el par de claves "privateDH.pem" y "publicDH.pem" pertenecen a Alice y "privateDH2.pem" y "publicDH2.pem" a Bob.

Paso 1

Derivamos un valor secreto con la clave privada de Alice y con la clave pública de Bob.

openssl pkeyutl -derive -inkey privateDH.pem -peerkey publicDH2.pem -out secreto1

Enter pass phrase for privateDH.pem:
Paso 2

Derivamos un valor secreto con la clave privada de Bob y con la clave pública de Alice.

openssl pkeyutl -derive -inkey privateDH2.pem -peerkey publicDH.pem -out secreto2

Enter pass phrase for privateDH2.pem:
Paso 3

Al comparar ambos valores deberían ser idénticos. Si al ejecutar el comando no sale ningún mensaje por la terminal, el resultado es el correcto.

cmp secreto1 secreto2

X25519

X25519 es un intercambio de claves Diffie-Hellman de curva elíptica utilizando la curva Curve25519. Como los restantes métodos Diffie-Hellman, permite que dos partes acuerden conjuntamente un secreto compartido mediante un canal inseguro o que intercambien sus claves públicas, de forma que la combinación pública-privada en cada extremo produce el mismo valor (secreto) que será utilizado para generar la clave de cifrado simétrico compartida. Esta curva en particular es utilizada por los conocidos sistemas de mensajería móvil Signal y Whatsapp.

Paso 1

Generamos un par de claves X25519 para Alice. Primero generamos la clave privada, que contiene la clave pública.

openssl genpkey -algorithm X25519 -out priv1.pem

Paso 2

Extraemos la clave pública de Alice a partir de la clave privada generada en el paso anterior.

openssl pkey -in priv1.pem -pubout -out pub1.pem

Paso 3

Generamos un par de claves X25519 para Bob. Primero generamos la clave privada.

openssl genpkey -algorithm X25519 -out priv2.pem

Paso 4

Extraemos la clave pública de Bob a partir de la clave privada generada en el paso anterior.

openssl pkey -in priv2.pem -pubout -out pub2.pem

Paso 5

Derivamos un valor secreto con la clave privada de Alice y con la clave pública de Bob.

openssl pkeyutl -derive -inkey priv1.pem -peerkey pub2.pem -out secreto1

Paso 6

Derivamos un valor secreto con la clave privada de Bob y con la clave pública de Alice.

openssl pkeyutl -derive -inkey priv2.pem -peerkey pub1.pem -out secreto2

Paso 7

Al comparar ambos valores deberían ser idénticos. Si al ejecutar el comando no sale ningún mensaje por la terminal, el resultado es el correcto.

cmp secreto1 secreto2

Secretos DH y EC como generadores de claves simétricas - Generadores de "carraca" (ratchet) y Forward Secrecy

Obsérvese que el "secreto" que se ha negociado con las dos parejas de claves DH es un valor binario de 256 caracteres (2048 bits), mientras que el secreto derivado de las claves X25519 tiene tan sólo 32 caracteres binarios (256 bits), ya que las claves EC (de curva elíptica) son de menor tamaño que las originales DH y por tanto, los números que resultan de las operaciones de derivación son de tamaño similar a las claves utilizadas.

Habitualmente, este secreto será empleado como generador de clave (y vector de inicialización, en su caso) del algoritmo de cifrado simétrico escogido entre ambas partes. Es común, sobre todo empleando curvas elípticas, que se necesiten más bits para la clave de cifrado simétrico (y vector) que el tamaño del propio secreto obtenido, pero esto no es problema, ya que el secreto no se usa directamente como valor de la clave. Lo que se hace es calcular un resumen determinado (sha-256, sha-512, etc.) del secreto y generar a partir de este resumen, directamente o por iteración de la función (realimentando la salida en la entrada tantas veces como se necesite) los bits necesarios para rellenar la clave (y el vector).

Una variante de este proceso bastante común en la actualidad es el empleo del secreto como "generador de carraca" o "ratchet function". En este caso, lo que se introduce en la función de resumen es la concatenación del secreto y un contador, lo que permitirá cambiar la clave (y el vector) en cada transmisión (identificada por su número en el contador siempre creciente), tal y como se hace en los mensajes de la conocida aplicación Whatsapp. Este tipo de generación de claves en secuencia garantiza la propiedad conocida como "Forward Secrecy", ya que el descifrado de cada mensaje requerirá el mismo esfuerzo para el atacante, dado que si no conoce el valor del secreto negociado, no podrá deducir la secuencia de claves que se aplica en cada mensaje.

S/MIME

En este apartado se realizará una introducción sobre el estándar S/MIME y ejemplos para dominar el manejo y estructura de correos electrónicos seguros. Dichos ejemplos se llevarán a cabo para el análisis y generación de este tipo de mensajes de correo electrónico seguro desde línea de comandos.

smime

-encrypt

Cifrar el correo para los certificados de destinatario dados. El archivo de entrada es el mensaje que se va a cifrar. El archivo de salida es el correo cifrado en formato MIME.

-decrypt

Descifre el correo utilizando el certificado suministrado y la clave privada. Espera un mensaje de correo cifrado en formato MIME para el archivo de entrada. El correo descifrado se escribe en el archivo de salida.

-sign

Firme el correo utilizando el certificado suministrado y la clave privada. Archivo de entrada es el mensaje a firmar. El mensaje firmado en formato MIME se escribe en el archivo de salida.

-verify

Verificar el correo firmado.

-in filename

El mensaje de entrada que se va a cifrar o firmar o el mensaje MIME que se va a descifrar o verificar.

-out filename

El texto del mensaje que se ha descifrado o verificado o el mensaje de formato MIME de salida que se ha firmado o verificado.

-text

Esta opción agrega encabezados MIME de texto sin formato (texto / sin formato) al mensaje suministrado si se encripta o firma.

-signer file

Un certificado de firma al firmar un mensaje, esta opción se puede utilizar varias veces si se requiere más de un firmante.

-to

Correo del receptor.

-from

Correo del emisor.

-subject

Asunto del mensaje.

Introducción

S/MIME (Secure / Multipurpose Internet Mail Extensions) es un estándar orientado a la criptografía de clave pública y firmado de correo electrónico encapsulado en MIME (una serie de convenciones o especificaciones dirigidas al intercambio a través de Internet de todo tipo de archivos de forma transparente para el usuario). [37]

Además, S/MIME provee los siguientes servicios de seguridad criptográfica para aplicaciones de mensajería electrónica:

  • Autenticación, integridad y no repudio (mediante el uso de firma digital).
  • Privacidad y seguridad de los datos (mediante el uso de cifrado).

Operaciones con S/MIME

Antes de nada, tenemos que instalar el certificado raíz y el certificado de usuario desde una autoridad certificadora responsable de emitir y revocar los certificados (por ejemplo, CAcert). Una vez instalado dichos certificados, se deberá configurar el certificado de usuario en aplicaciones de correos electrónicos como Mozilla Thunderbird, Microsoft Outlook Express o Apple Mail.

El certificado raíz es un certificado de clave pública sin firma o autofirmado que identifica la autoridad de certificación raíz (AC). Esto servirá para asegurar que un certificado de usuario sea de confianza.

Envío de mensajes firmados

Paso 1

Primero tenemos que extraer nuestro certificado de usuario en formato PKCS # 12 (se utiliza para almacenar claves privadas y certificados en un solo archivo cifrado [38]) y se nos pedirá una contraseña para proteger dicho certificado. Nuestro certificado se llamará "Certificados.p12". Obsérvese que es diferente exportar un certificado (que generará un fichero ".cer" o ".crt" solo con la parte pública) que extraer o "hacer copia" en cuyo caso se solicitará contraseña para cifrar la clave privada y se generará como fichero PKCS#12 y extensión ".p12".

Paso 2

Un formato alternativo más simple a PKCS # 12 (.p12) es PEM, que solo enumera los certificados y las claves privadas como cadenas Base 64 en un archivo de texto. Primero tendremos que introducir la contraseña que protege "Certificados.p12" y luego introducir una nueva para el certificado en formato PEM como se muestra a continuación:

openssl pkcs12 -in Certificados.p12 -out Certificado.pem

Enter Import Password:
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
Paso 3

Para enviar un mensaje (texto.txt) usaremos el comando "-sign" (firma el correo utilizando el certificado suministrado y la clave privada. El archivo de entrada es el mensaje a firmar. El mensaje firmado en formato MIME se escribe en el archivo de salida.), "-text" (agrega encabezados MIME de texto sin formato al mensaje suministrado si se cifra o firma), "-signer" (certificado de firma), "-from" (correo del emisor), "-to" (correo del destinatario), "-subject" (asunto).

Se deberá introducir la contraseña que protege la clave privada.

openssl smime -sign -in texto.txt -text -signer Certificado.pem -from emisor@hotmail.com -to receptor@hotmail.com -subject "Mi mensaje firmado" -out smimeFirmado.eml


Enter pass phrase for Certificado.pem:

Paso 4

Monstraremos el mensaje haciendo un "cat". Se podrá observar que el texto se lee y que la firma se encuentra en el anejo "smime.p7s".

cat smimeFirmado.eml

To: receptor@hotmail.com.com
From: emisor@hotmail.com
Subject: Mi mensaje firmado
MIME-Version: 1.0
Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg="sha-256"; boundary="----79B426144F5D0703AB81685861B9D87C"

This is an S/MIME signed message

------79B426144F5D0703AB81685861B9D87C
Content-Type: text/plain

En un lugar de la Mancha de cuyo nombre no quiero acordarme...
------79B426144F5D0703AB81685861B9D87C
Content-Type: application/x-pkcs7-signature; name="smime.p7s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7s"

MIIIVgYJKoZIhvcNAQcCoIIIRzCCCEMCAQExDzANBglghkgBZQMEAgEFADALBgkq
hkiG9w0BBwGgggWHMIIFgzCCA2ugAwIBAgIDE+XbMA0GCSqGSIb3DQEBCwUAMHkx
EDAOBgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9y
ZzEiMCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3
DQEJARYSc3VwcG9ydEBjYWNlcnQub3JnMB4XDTE4MTEyMTE5NDIxNloXDTE5MDUy
MDE5NDIxNlowQzEYMBYGA1UEAxMPQ0FjZXJ0IFdvVCBVc2VyMScwJQYJKoZIhvcN
AQkBFhhzdWZpdmFsdmVyZGUxM0BnbWFpbC5jb20wggEiMA0GCSqGSIb3DQEBAQUA
A4IBDwAwggEKAoIBAQCz8al3/lHzwxAcQgFbBiNENRTaBX76glnOyqHGeanE4SZc
CKHUDG9VTxQwX+hQVjlfROtV1ednjihCnTUCuEuAw5xLX3PE5JoQSqILkZhrNr1v
.....ETC

------79B426144F5D0703AB81685861B9D87C--

Envío de mensajes cifrados

Paso 1

Para enviar un mensaje cifrado se necesita tener el certificado del destinatario. Una vez obtenido, se procede al envío y cifrado de dicho mensaje de la siguiente forma:

openssl smime -encrypt -in texto.txt -from emisor@hotmail.com -to receptor@hotmail.com -subject "Mi mensaje cifrado" receptor.pem > smimeCifrado.eml

Paso 2

En este paso mostraremos el mensaje ejecutando un "cat". Como se puede observar, a diferencia del apartado anterior, el texto no aparece (ya que está cifrado) y aparece el anejo ".p7m".

To: receptor@hotmail.com
From: emisor@hotmail.com
Subject: Mi mensaje cifrado
MIME-Version: 1.0
Content-Disposition: attachment; filename="smime.p7m"
Content-Type: application/x-pkcs7-mime; smime-type=enveloped-data; name="smime.p7m"
Content-Transfer-Encoding: base64

MIICHAYJKoZIhvcNAQcDoIICDTCCAgkCAQAxggGdMIIBmQIBADCBgDB5MRAwDgYD
VQQKEwdSb290IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAg
BgNVBAMTGUNBIENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEW
EnN1cHBvcnRAY2FjZXJ0Lm9yZwIDE+eRMA0GCSqGSIb3DQEBAQUABIIBAID52yLZ
iR/MroIlAyee/o7n6/Az2Hp8TUNIsrNyCpD+vlSWIglaelGGA16neYIFQ3TW15dc
gPXPZUbgJHN37XPzxhp8PKwneimeRrzNUDgw4jUtH374WpaiO5QIoNp9ZS1osEVl
L9v4B1ATFZVLtLWwVU5D/EoCP/bHANc7SnyYcbjRseSCiD9nVipDvuLsgT0X0lIb
HmMvadI7c2KLu9S3i9mFE+74Ic274dafierHZ6P5yn8fZLU0HY3Sf7p0Ec7mt0Cc
LWbBzLrrMqfF5BnVOYSTp3l4+gzVILPcJfja2L9KlVppnz3WP+FeyZct0MwW02WE
wL64UTRKLgZo/nwwYwYJKoZIhvcNAQcBMBQGCCqGSIb3DQMHBAgCqH16tl9nuIBA
lXZK1HLy7rwMhouInIr7Ppk2Q5LoBCrTS34AxC/Zx4F312cb9IoK5y9BVcbBAB1W
mEoXfDjHZWV5zI/il6exrQ==

Envío de mensajes firmados y cifrados

Paso 1

Para enviar un mensaje firmado y cifrado, tenemos que tener el certificado de usuario de la persona a la que se quiere enviar el mensaje.

Una vez obtenido el certificado del destinatario, tenemos que realizar los mismos pasos que en el apartado anterior pero a la hora de enviar el mensaje habrá que añadir lo siguiente:

openssl smime -sign -in texto.txt -text -signer emisor.pem -from emisor@hotmail.co -to receptor@hotmail.co -subject "Mi mensaje firmado y cifrado" | openssl smime -encrypt -from emisor5@hotmail.com -to receptor@hotmail.com -subject "Mi mensaje firmado y cifrado" receptor.pem > EnviarMsn.eml

Enter pass phrase for emisor.pem:

Introducimos la contraseña que protege nuestra clave privada.

Descifrar mensaje firmado y cifrado

Paso 1

El destinatario cuando reciba el mensaje anterior podrá hacer un cat en la que aparecerá la información que introdujo el emisor a la hora de enviar el mensaje (si exporta el mensaje desde la aplicación de correo al sistema de ficheros como ".eml").

cat EnviarMsn.eml

To: receptor@hotmail.com
From: emisor@hotmail.com
Subject: Mi mensaje firmado y cifrado
MIME-Version: 1.0
Content-Disposition: attachment; filename="smime.p7m"
Content-Type: application/x-pkcs7-mime; smime-type=enveloped-data; name="smime.p7m"
Content-Transfer-Encoding: base64

MIIQAAYJKoZIhvcNAQcDoIIP8TCCD+0CAQAxggGdMIIBmQIBADCBgDB5MRAwDgYD
VQQKEwdSb290IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAg
BgNVBAMTGUNBIENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEW
EnN1cHBvcnRAY2FjZXJ0Lm9yZwIDE+eRMA0GCSqGSIb3DQEBAQUABIIBAG0d2EmV
9bnpN31tY869teLO2obFtE9RlZ4j6Kk7WadalowbQBE2wq1vDuXkVYc3rWw3r7hO
VJ0fjCRC3oXWgLHpOIQ9gREjfK7+HHFhwYlZz1MBMGQTFEA4N7G7o2xMqRqCPu/9
Uv7y60qlpXm1QyATdQjLj1jm/C2UgC0NBCoaHEJDPIq26euKrc/gP9n5EHz7RR2r
bZWIlwJZQIBPqFWFY0UL/hCzW2sT5rtfhth+RZgdQTcLaV1HPO2noqbJr7cG7PZF
xDdnFl3+2jV7HLYpILVe7bXvIIvDHAjE9C8yskXlARWDW9Qf4bu9gWukTvtWryQQ
FR7Dk4/Ie8zt2w0wgg5FBgkqhkiG9w0BBwEwFAYIKoZIhvcNAwcECP6OoUisdeZ4
gIIOICsC80w15IrRmhWW3Bqw7a9h1Rl3V9SAnVCTF2nivtMUOoFdNXm531+XcFIi
uXexV4szSy/jUuvrvMIQH9jnc2mEdGhZ5MZ8t0ZinTnsMVJdE55aVJCm7X5HVAzT
......ETC

Observar que solo aparece un anejo de extensión ".p7m" (cifrado) que contendrá tanto el texto como la firma (en anejo ".p7s").

Paso 2

Para descifrar el mensaje el destinatario tendrá que introducir su certificado personal ejecutando el siguiente comando:

openssl smime -decrypt -in EnviarMsn.eml -recip receptor.pem -out RecipMsn.txt

Enter pass phrase for receptor.pem:

El destinatario tendrá que introducir la contraseña que protege su clave privada.

Paso 3

Finalmente, se podrá leer el mensaje haciendo un "cat".

cat RecipMsn.txt

To: receptor@hotmail.com
From: emisor@hotmail.com
Subject: Mi mensaje firmado y cifrado
MIME-Version: 1.0
Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg="sha-256"; boundary="----BBD077D8F787A08996B7D67BCDEF93B9"

This is an S/MIME signed message

------BBD077D8F787A08996B7D67BCDEF93B9
Content-Type: text/plain

En un lugar de la Mancha de cuyo nombre no quiero acordarme...
------BBD077D8F787A08996B7D67BCDEF93B9
Content-Type: application/x-pkcs7-signature; name="smime.p7s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7s"

MIIIVgYJKoZIhvcNAQcCoIIIRzCCCEMCAQExDzANBglghkgBZQMEAgEFADALBgkq
hkiG9w0BBwGgggWHMIIFgzCCA2ugAwIBAgIDE+XbMA0GCSqGSIb3DQEBCwUAMHkx
EDAOBgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9y
ZzEiMCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3
DQEJARYSc3VwcG9ydEBjYWNlcnQub3JnMB4XDTE4MTEyMTE5NDIxNloXDTE5MDUy
MDE5NDIxNlowQzEYMBYGA1UEAxMPQ0FjZXJ0IFdvVCBVc2VyMScwJQYJKoZIhvcN
AQkBFhhzdWZpdmFsdmVyZGUxM0BnbWFpbC5jb20wggEiMA0GCSqGSIb3DQEBAQUA
A4IBDwAwggEKAoIBAQCz8al3/lHzwxAcQgFbBiNENRTaBX76glnOyqHGeanE4SZc
CKHUDG9VTxQwX+hQVjlfROtV1ednjihCnTUCuEuAw5xLX3PE5JoQSqILkZhrNr1v
1Sv86Y3iyovDsZWBZJHFjhdB6To2+z0gbaGBDy+NmOlQV6iAOaLAjJ8ZXCfbWN8a
7oOIahZQJqojLgTpkKrQgZPnVuMA/maM9V9WHr4Amze88wwPtiBe470zHltY6KTi
8d/26g0im1vm/STAjJpyZzXxlVZq3RGc3a+QTYUQHtETRSQu5AU8QxI9NHg/3we6
eMiEw5XpcneC40ogECvG4fula87Y8iMskcBxoVZJAgMBAAGjggFIMIIBRDAMBgNV
......ETC

------BBD077D8F787A08996B7D67BCDEF93B9--

Verificación de mensajes

Paso 1

Para poder verificar que el mensaje y la persona que lo envía son de confianza ejecutamos el siguiente comando. En "-CAfile" se introduce el certificado raíz de la autoridad certificadora.

openssl smime -verify -in RecipMsn.txt -CAfile CACertSigningAuthority.crt

ontent-Type: text/plain

Verification successful
En un lugar de la Mancha de cuyo nombre no quiero acordarme...

Obsérvese que no se ha incorporado en el comando de verificación el certificado del firmante (emisor del correo), ya que habitualmente los agentes de correo como Thunderbird incorporan como adjunto el certificado del firmante (emisor) en todos los mensajes firmados, como opción por defecto. De no ser así, el comando informaría de error en la verificación por falta de un certificado y sería necesario incorporar el certificado del firmante, con la opción "-certfile CertEmisor.pem" o similar.

Generación y verificación de certificados X.509

Un certificado X.509 autofirmado contiene una clave pública, información acerca del propietario del certificado y la firma del propietario. Además, tiene una clave privada asociada, aunque no verifica el origen del certificado a través de una tercera entidad emisora de certificados, es decir, no existe una entidad que lo valide.

En este apartado se explicará el procedimiento para generar una cadena de certificados, incluyendo un certificado raíz autofirmado al que llamaremos "certificadoRaiz.crt". Este último será el que firme un nuevo certificado al que llamaremos "certificadoIntermedio.crt" y además, verificaremos por separado cada uno de ellos.

Y para terminar crearemos otro certificado llamado "certificadoFinal.crt" firmado con el "certificadoIntermedio.crt". Se validará el certificado final concatenándolo con el certificado intermedio y de esta forma, constituirán el certificado "chain.crt"

Certificado Raíz Autofirmado

Paso 1

Generamos el certificado raíz RSA que contendrá la clave privada cifrada en AES con la que firmaremos el "certificadoRaiz.crt".

openssl genpkey -algorithm RSA -aes256 -out certificadoRaiz.key -pkeyopt rsa_keygen_bits:2048

..+++++
.........................................+++++
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
Paso 2

Hacemos un "cat" para ver nuestra clave privada generada en el paso anterior.

cat certificadoRaiz.key

-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFLTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIWm127tzFQOUCAggA
MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBAqVF1oeyS8Z48zXgmt4EQ0BIIE
0LWoJvHdQnRLkmvl9NjeKqOpxVDk00WIXhsI8tffpV7YHVxipRTHVhILkyuY4w+Z
HdikO3bciTZiS7OqGLnoJ5tY6HJaSQrLohiWgZqQz7I/Rbaax/t0YpkrzAYhewy3
AktV29pFs/VQNio4UUBZ4kHpZLxXztnI7wom9dOs4sqin2LnwV2PZ6thabWQJlsn
sR89i57cuVulYq45wAkaCZsbjNNdWonhlV7Bm7v90iu5jDGz9zVkcmt0X8H6Ys2U
zTWtYx5PCcKiqM4l2FRE97DsoZny1Sy/N9ZtHsyGcHIyMTyeNcZr4vjWGOrA6UYs
yTqYVw+NhF6GwehdWmIpIgxk3VBMr1kbJDzYExJCt4x8J9PVA3o8eUQlJW2Y/0NY
q0lzWeeiZSAIt89AVH1witszaeJjPDwNXDdtduIZXgA1lCIoBIVmE/7C5z9cBe0K
Nz6F4g+GQ5/Isj9sd9OT4WshfcWjZqsVSnk8VzJTYorMjNTSdgqJmX9y/ieBtDFw
+FV4jKlBRYoGmDNEuJm3HdbaRz63DDxTpq+xhVK4+lgkGZsFQpRxLuJxv5C55UoH
vS3OD1ICMtLmn2oYxaGkwEctGE/G1I0FKThKw5x7ygvxmSuXqS7cjiUrV2stsF2I
lcI6poj5s0YoZaUqRzd4nyBHRG2IgR4rb2vsSQnVNAV0pVdW+7eQYDx74ojZ1pTE
V+pBsE+xB2tzdpcREmsYPB5huy6h5aQASU2OWFgTHP198wSUrquEF9PbmAhc/qI2
X2Qn00jkBzE/cRDKa9Mw7p3dQjowFtKKW0XAl2pyWoPQc2S9BItK9aFqCpd/NbQ8
7FpK3Gr3aK31tJnPJuX7mD0ziZq8i8B9JymoHr+i+Zm/rrbNd+HgYgTsymz5+qi+
vkz/F8LZFVSI+Tg4T+T7Mf5HXV9GuI0BuzD23YdCXGIK1MHRD60swnlBDtA6jgQH
oSqT4QIjUPq84UXZiPKheQVnYHvGTJUWikMU/a6/LkbbXKiy6f0oxlEM/9sgVOKn
qXz7jdBDJP8SS9WmLvcDtLGNwTWwKfsOF9TsbnqqxhjQ+OmlH6Usgeiw5DW4ppO4
2cKfWHhMHBeQY5osL1FeyVdqwTqkAv8T6mV3mgCFXc664BYq2XAori40cJWPiX/W
3SX4PoRYPkwkWObL6QXcF6uaM/GbMk6SMGn7LryOSI1dFRAymgAdVaWkiKtiDfAO
ilViCE4V3ABea+OvMUxQ6DQ0Ei5RzaGlteuhm6AlKJzOBbBbhc9DABJUGw0Bqlbb
JWBCoM3CIyTbN6hmxCKhh/wwTil2dNTYrikHrdlrqRhLqtq2s5OlJpM0l/0H4AUu
mJYBmXHPQTVmqaYePgQiFY3dnk7P8nOZKav1HAgxWSMj1GjlpkRYlRFsWLx345Dt
YyRVjT96SLpVSV1HMMxq/Ev1hm9mb2tJo89kxYgVbGiAIdeeCOQi+SFcLn6xGVUb
UJIaMmbQraiAS7EG0oRDyQB96Zfx/Ku7r9ABqnRVj/c0wxwcMIYNOSjwqztQvly1
njsojGoAPdnzzL8zRf7p1iygg5OWxehdUJBBX8CLYUL9oBs3SCm6SLcmLZ/ARtJY
owD3LyGlTkJKexg3TysL3hPBX7sI/Jc8NZcj6IwUZ9vX
-----END ENCRYPTED PRIVATE KEY-----
Paso 3

A continuación generamos una solicitud de firma de certificado (CSR, Certificate Signing Request) que contiene la información del certificado junto con la clave pública, y es lo que envía a las autoridades certificadoras para ser firmada (generar el certificado de confianza). En este caso seremos nosotros quien la firmaremos y no por una autoridad certificadora. En dicha solicitud habrá que rellenar una serie de datos como se muestra a continuación:

openssl req -new -key certificadoRaiz.key -out certificadoRaiz.csr

Dato: -key nos pide la clave privada del certificado.

Enter pass phrase for certificadoRaiz.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]:Las Palmas
Locality Name (eg, city) []:Las Palmas de Gran Canaria
Organization Name (eg, company) [Internet Widgits Pty Ltd]:estudianteSL
Organizational Unit Name (eg, section) []:estudianteSL
Common Name (e.g. server FQDN or YOUR name) []:www.estudianteSL.com
Email Address []:correo1@ulpgc.es

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Paso 4

Hacemos un "cat" para ver el certificado pendiente de firma.

cat certificadoRaiz.csr

-----BEGIN CERTIFICATE REQUEST-----
MIIC+zCCAeMCAQAwgbUxCzAJBgNVBAYTAkVTMRMwEQYDVQQIDApMYXMgUGFsbWFz
MSMwIQYDVQQHDBpMYXMgUGFsbWFzIGRlIEdyYW4gQ2FuYXJpYTEVMBMGA1UECgwM
ZXN0dWRpYW50ZVNMMRUwEwYDVQQLDAxlc3R1ZGlhbnRlU0wxHTAbBgNVBAMMFHd3
dy5lc3R1ZGlhbnRlU0wuY29tMR8wHQYJKoZIhvcNAQkBFhBjb3JyZW8xQHVscGdj
LmVzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9ELs4JySnm3tWGKp
k2XRlHjNelLNdZL1b/S2wKcaAbMh0tIUU3/7DK1q9HQItb29CAA5J3oHs/3gaR1/
1pZi8oh7qMFUbpDaqj8V9/Ir/a4YLp35etzAeAMzI32L8eTLqO5eoJeVS4k8K6S6
wF5YdoEwTA1LXd0XLLLzTXvRc1YmzfKRG+KFX/EocIxQU4kSQpaGFgfMwIf7jDBW
Yh7UZ/+gVDKAFPmhDzVxAupEZCIljLm4XLwbD+2+a3FXWr08NFDdn8NBJyWxLQ4K
1wAX9ErmRDeNQce9rMAI6HL+xBW3OaytApDKkI5aYgbCoIBJzah2HOllXSEKzdET
/uC5NwIDAQABoAAwDQYJKoZIhvcNAQELBQADggEBAMss/OQ0MkUvcgR3yXU+gkWG
NAsTwgN/DTkKZluelHnZofbMHv96fwp1mdUfxWJYoUJpdzd2lxdoTNsZypBA5w+x
ajVAH8XpAWvKV5WvApvRlKCBfBJYj0dYvmhMdGxEmn84LKL7Y5etH3J2hHHCp9yP
8264mbPcSgd2eJ650A4nR3rBrNB2F+eOMK4fnI+6q7COcvorsh7tmT6QYkcgtWWf
CzS7LTWVZ6WUGNRiemGcA29pRzqgPzHypeXU3+nfo9bFXSZp+dudczxDU42bsAwk
h5nkqBKFn89J5FNchHdwpcMJiVL7Q2sXeUH5hdEZzuZcYIZv3Zb1ACqrIXORsYw=
-----END CERTIFICATE REQUEST-----
Paso 5

Finalmente, pasaremos a generar el certificado autofirmado utilizando nuestra clave privada. El comando "openssl x509" se utiliza para firmar solicitudes y verificar certificados. La opción "-req" indica que se intenta crear un certificado a partir de una solicitud desde el archivo especificado por "-in". El certificado será guardado con el nombre que indica "-out" y será válido por "-days" días a partir de la fecha actual del servidor. Por último, el parámetro "-signkey" indica la clave con la que será firmado el certificado, la cual (en este ejemplo) es la propia clave privada del certificado emitido.

openssl x509 -req -days 7300 -in certificadoRaiz.csr -signkey certificadoRaiz.key -out certificadoRaiz.crt

Signature ok
subject=C = ES, ST = Las Palmas, L = Las Palmas de Gran Canaria, O = estudianteSL, OU = estudianteSL, CN = www.estudianteSL.com, emailAddress = correo1@ulpgc.es
Getting Private key
Enter pass phrase for certificadoRaiz.key:
Paso 6

Verificamos que el certificado autofirmado se ha creado correctamente. Primero habrá que introducir el certificado de la autoridad certificadora, en nuestro caso es el certificado raíz.

openssl verify -CAfile certificadoRaiz.crt certificadoRaiz.crt

certificadoRaiz.crt: OK

Otra manera de ver las características del firmante (issuer) y del firmado (subject) sería ejecutando el siguiente comando:

openssl x509 -text -noout -in certificadoRaiz.crt

Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number:
            39:40:8e:71:94:8c:aa:0d:74:58:17:40:4b:e9:01:5c:a0:4e:98:16
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = ES, ST = Las Palmas, L = Las Palmas de Gran Canaria, O = estudianteSL, OU = estudianteSL, CN = www.estudianteSL.com, emailAddress = correo1@ulpgc.es
        Validity
            Not Before: Dec 18 16:04:45 2018 GMT
            Not After : Dec 13 16:04:45 2038 GMT
        Subject: C = ES, ST = Las Palmas, L = Las Palmas de Gran Canaria, O = estudianteSL, OU = estudianteSL, CN = www.estudianteSL.com, emailAddress = correo1@ulpgc.es
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:f4:42:ec:e0:9c:92:9e:6d:ed:58:62:a9:93:65:
                    d1:94:78:cd:7a:52:cd:75:92:f5:6f:f4:b6:c0:a7:
                    1a:01:b3:21:d2:d2:14:53:7f:fb:0c:ad:6a:f4:74:
                    08:b5:bd:bd:08:00:39:27:7a:07:b3:fd:e0:69:1d:
                    7f:d6:96:62:f2:88:7b:a8:c1:54:6e:90:da:aa:3f:
                    15:f7:f2:2b:fd:ae:18:2e:9d:f9:7a:dc:c0:78:03:
                    33:23:7d:8b:f1:e4:cb:a8:ee:5e:a0:97:95:4b:89:
                    3c:2b:a4:ba:c0:5e:58:76:81:30:4c:0d:4b:5d:dd:
                    17:2c:b2:f3:4d:7b:d1:73:56:26:cd:f2:91:1b:e2:
                    85:5f:f1:28:70:8c:50:53:89:12:42:96:86:16:07:
                    cc:c0:87:fb:8c:30:56:62:1e:d4:67:ff:a0:54:32:
                    80:14:f9:a1:0f:35:71:02:ea:44:64:22:25:8c:b9:
                    b8:5c:bc:1b:0f:ed:be:6b:71:57:5a:bd:3c:34:50:
                    dd:9f:c3:41:27:25:b1:2d:0e:0a:d7:00:17:f4:4a:
                    e6:44:37:8d:41:c7:bd:ac:c0:08:e8:72:fe:c4:15:
                    b7:39:ac:ad:02:90:ca:90:8e:5a:62:06:c2:a0:80:
                    49:cd:a8:76:1c:e9:65:5d:21:0a:cd:d1:13:fe:e0:
                    b9:37
                Exponent: 65537 (0x10001)
    Signature Algorithm: sha256WithRSAEncryption
         0a:44:eb:08:3c:29:9d:1e:70:08:3e:ae:f3:be:86:f0:45:df:
         6b:4e:33:62:da:6b:40:66:65:10:5e:ef:db:e7:f6:5f:57:92:
         55:5a:e4:cb:39:9b:b2:25:ca:c1:b3:72:4d:c2:58:1d:91:ad:
         2c:a7:2d:a9:b9:5a:0f:f9:e0:d4:70:86:04:23:fe:22:1d:d3:
         d5:97:6b:7c:a8:f4:32:37:a8:47:bc:fc:c1:f2:5c:67:89:05:
         c5:fc:a2:44:a2:e9:59:77:71:59:04:2e:fa:df:6d:56:9c:45:
         64:ac:be:5e:d4:33:30:6f:63:1b:3d:21:6f:65:da:df:9a:1c:
         5c:27:54:c0:8e:0b:57:48:50:87:a3:9f:ed:65:9d:1f:77:92:
         0b:7a:e3:ed:68:df:9a:c1:fb:80:05:54:f6:1d:dc:3d:a7:73:
         c5:fc:41:03:a8:36:f2:40:96:56:73:57:e4:55:1a:c5:b6:94:
         5a:1f:19:7a:af:0e:eb:c0:32:2b:30:01:69:2d:c9:dc:ac:2a:
         bd:ca:c4:86:86:81:a5:99:f5:1d:4f:d8:a6:5f:4d:72:97:36:
         15:6a:f5:28:a1:18:d9:a7:7b:c9:89:d1:ee:c9:f6:a9:5f:29:
         52:bc:b9:2c:b4:f8:4d:48:1d:62:3e:4f:87:b1:a5:f5:90:92:
         8f:fd:a3:e7

Podemos observar tanto los datos del issuer como los del subject (en este caso son los mismos). Además, se observa la clave pública en hexadecimal (2048 bits) y la firma del issuer en hexadecimal, que contiene todo los datos del certificado incluyendo la clave pública (se le aplica una función de resumen y posteriormente, un algoritmo de cifrado).

Dato: destacar que si posee un "Certificado.key" de alguna autoridad de confianza, se podría usar a la hora de firmar el nuevo Certificado creado por nosotros y así, obtener un certificado autofirmado con la clave privada de dicha autoridad.

Certificado Intermedio

Paso 1

Generamos el certificado intermedio RSA que contendrá la clave privada cifrada en AES y la usaremos para firmar el certificado final en el siguiente apartado.

openssl genpkey -algorithm RSA -aes256 -out certificadoIntermedio.key -pkeyopt rsa_keygen_bits:2048

...............................................................................................+++++
..........+++++
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
Paso 2

Hacemos un "cat" para ver nuestra clave privada generada en el paso anterior.

cat certificadoIntermedio.key

-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFLTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIS4RhdKnGb28CAggA
MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBDgcEiWqDyYE6Hiln0++0q+BIIE
0CBcD8ObCTPSdNhT7Ef/35zatD9uStTNj9ZytjmoSY5E1Z+HaG2B50c15m3/YOdV
ooYu/M0MLwkoOrTW19gmwhsIjfv4tIK5XIDbyUlo+1c2QsPbiNJAoT7p9FA5axD9
Op62GiTju2VszXWdGCAVlDpJ8vG9aBYmi2JTTq8Gdb/ofX7l1nerdMkUHeke9ajW
foT1PriuFZxiinjeYr1JmW9zUYwwC5DylKzwHXNG5tD07Ds23dWGYmPa53SCMVAl
9ORu8mPo8DGbV5487sUL+RQDtzwXjLj+O0TPid37wuW/fnn8hYY4DqW4Hdn4rn8v
k4JywWqg3Se1BZ7FCx1IYOWpPZP8Qmcn2sTQKBlNHiZ73W6Izo9UOus34D6Ik6gH
1x2Fsv/KqiAJts+I7NVxDuMxy2J04M+1M8nfeZdvejUxo9Tq3YYvrxvWi3ncC3aQ
QJqYpsOJGPHycSS/1XgCmQjbxqdJya+ZbA9SSxhVJbfCC1+WaPuGWuElVKA8SWh1
paIMLhJyjNJCOiHmEyHohwbs2HMWB6XuCpwzetxK+E4nw+NzqnREvZ7CwKZnsWxl
E6LhxOJS74CbbkmTOF+z2K8PPK+hyy5vzyOD2HqykmOiZ76m1Bre22Zw10IJJHot
85YtJax5L24mWXDpLgU2pWxe/ZaXYIMwLmP42lhO2mb9uGNaMFMgJ3CjTlw7DLRJ
xYf5LOX6R9uAfMU744y8l0datosBIiFpuC0UT6qJj1G6fpsG4ynC3zHJ4aqHXTZe
bEjrNKRpAYGqlIeB1fzMmqTuXLGvMzuuaFDliN/8y79uD+zCTKSjukChB3vWsYvn
PT+l6tmWPbUhMlZatYRmODeoZL12Xu4KiYIFR64TWf8iWxznA19MzQ5sxYVozqAu
LUJW3f9idO2JtbkDmXXrFiWMoa1ZJpQ4H37tN9lBf/lYoBBvf6nEp74M0itPTiMc
p/E44idOEDukhemijM6DzMWf2pdntvby1QMySq7+kU2NLJCFCSS1f+U/W1VlrdFg
73JbMMcxWbyME9WTU78+OAT84TGtTdpG3s9iPoEPRDKjeAr11EdRD/ooaRZ3NM8L
vdT1TRtScvb61DIcThvviTupm1MDpyp+WylxH2zU0rBSnhO+wWIHSq+NfJVh6qAI
J+X7pRndxHuHFB9mJXoFtXgF81E6DpS06jhY/UP2FaSnD6gq3DPva/DX6adpinou
r/zQvSFIrvRxu6RPIvBuiQnKZR7QCToGfB1TffUg7QyKx/2Qwe7w6hGAhCL5gICq
+DmeVo5UABgT0IPGI8iloRgSfgxP07rIhWn74tSD32IMncFhNjr1UWvLMhWIx1VM
G6WwrPb8dwh9Bow323xf+dY3plFuBf5aPmK5iMRg4BXM67WOu+sG7fDBh9jWsQXx
wjUyaWRoLJoobontZsGKCECSdgar4P4E6XrX0uz7xwDaYaJLTWQ4z+gD63u24gw4
fVFLCJBESEhkYNcIFCZhLKti1Zx1AVT/kK4h2DRkNAeFwbCx24AK8NEz9TBLWew8
N6v/s/0hDX4xYszTdCZFVf0CcZ2YgGyUIHJnuSYJk8DlOUUc84CW8vmmVrRI0BQF
2z1nduWHQh6GkeFHInyWGQSwSjP/2kf8/2l7l7GfVH3P
-----END ENCRYPTED PRIVATE KEY-----
Paso 3

A continuación generamos una solicitud de firma de certificado.

openssl req -new -key certificadoIntermedio.key -out certificadoIntermedio.csr

Enter pass phrase for certificadoIntermedio.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]:Sevilla
Locality Name (eg, city) []:Sevilla
Organization Name (eg, company) [Internet Widgits Pty Ltd]:estudiantesevilla
Organizational Unit Name (eg, section) []:estudiantesevilla
Common Name (e.g. server FQDN or YOUR name) []:www.estudiantesevilla.com
Email Address []:correo2@sevilla.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Paso 4

Hacemos un "cat" para ver el certificado pendiente de firma.

cat certificadoIntermedio.csr

-----BEGIN CERTIFICATE REQUEST-----
MIIC9zCCAd8CAQAwgbExCzAJBgNVBAYTAkVTMRAwDgYDVQQIDAdTZXZpbGxhMRAw
DgYDVQQHDAdTZXZpbGxhMRowGAYDVQQKDBFlc3R1ZGlhbnRlc2V2aWxsYTEaMBgG
A1UECwwRZXN0dWRpYW50ZXNldmlsbGExIjAgBgNVBAMMGXd3dy5lc3R1ZGlhbnRl
c2V2aWxsYS5jb20xIjAgBgkqhkiG9w0BCQEWE2NvcnJlbzJAc2V2aWxsYS5jb20w
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC0S/s2FfY19DDt+u3OOx1I
DlBiDtMhAC1WdyIReaKNvNZuiSBb5/oIn7zkl3BjLfsD1efLNr75lNXnWsNiHtV+
9ifyJtlS+UQzjiVoAKrNnBklSo0sMKX/VmKRG+qjQh51yBCQbzQN5lR2ABcbCksp
FGMu3t3ipPkMnk6kjpZzXPblVFnjMD4dYLvm6qAp+apWliZGl3g0Pxe/77S2tGn0
tscDqVv+Kxo4aAwfPZtwFmnZ+3X/Mk5Q7h05gbZ/20hGPCTkvFkIOseXCRWX7gSa
ZCMYJAVZL+Bxv//Ir+qkQbtMbkdbibOYj6J0BlaTylVAft/aE0BDIqJ+kA6s9Hdp
AgMBAAGgADANBgkqhkiG9w0BAQsFAAOCAQEAjyAY+eTNUHu8jh8pwe+t2icOPy3X
LV+nugeTcepWDybI+r2Wx80iNodA/bfhIzeEfvZgykMHOG8Kk0PaFwMrK+SeaGbQ
V470X+NE30f3a6GRRTmn56Eo6OxXSwOk+A7UdJrq2hDSo4e17osG1hgZeMuvu9+/
bh2r2krd0q5tydHKuE+mKspNz+v1KG4gXIrLgIPN/NoPiWhwUnXS+RXUV06L1yxT
QbbTn9Cyf5MEHNY4mz/D2i6PscbjEqGp9Tu6094UHdUvk5gRo3TtxiLOlNyzvHjM
SOM3ZCWjCxz1G7meqfe8lfHyvRAx4Q8ZQOnImNaxkaQ5YcMJkOJTQ6OrxQ==
-----END CERTIFICATE REQUEST-----
Paso 5

Firmamos el certificado intermedio con la clave privada del certificado raíz.

openssl x509 -req -days 360 -in certificadoIntermedio.csr -CA certificadoRaiz.crt -CAkey certificadoRaiz.key -CAcreateserial -out certificadoIntermedio.crt

Signature ok
subject=C = ES, ST = Sevilla, L = Sevilla, O = estudiantesevilla, OU = estudiantesevilla, CN = www.estudiantesevilla.com, emailAddress = correo2@sevilla.com
Getting CA Private Key
Enter pass phrase for certificadoRaiz.key:

Mostramos el certificado con más detalles como hicimos con el certificado anterior.

Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number:
            45:45:ad:07:94:35:09:9f:43:69:67:e6:79:01:b7:65:23:bd:d5:19
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = ES, ST = Las Palmas, L = Las Palmas de Gran Canaria, O = estudianteSL, OU = estudianteSL, CN = www.estudianteSL.com, emailAddress = correo1@ulpgc.es
        Validity
            Not Before: Dec 18 16:29:35 2018 GMT
            Not After : Dec 13 16:29:35 2019 GMT
        Subject: C = ES, ST = Sevilla, L = Sevilla, O = estudiantesevilla, OU = estudiantesevilla, CN = www.estudiantesevilla.com, emailAddress = correo2@sevilla.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:b4:4b:fb:36:15:f6:35:f4:30:ed:fa:ed:ce:3b:
                    1d:48:0e:50:62:0e:d3:21:00:2d:56:77:22:11:79:
                    a2:8d:bc:d6:6e:89:20:5b:e7:fa:08:9f:bc:e4:97:
                    70:63:2d:fb:03:d5:e7:cb:36:be:f9:94:d5:e7:5a:
                    c3:62:1e:d5:7e:f6:27:f2:26:d9:52:f9:44:33:8e:
                    25:68:00:aa:cd:9c:19:25:4a:8d:2c:30:a5:ff:56:
                    62:91:1b:ea:a3:42:1e:75:c8:10:90:6f:34:0d:e6:
                    54:76:00:17:1b:0a:4b:29:14:63:2e:de:dd:e2:a4:
                    f9:0c:9e:4e:a4:8e:96:73:5c:f6:e5:54:59:e3:30:
                    3e:1d:60:bb:e6:ea:a0:29:f9:aa:56:96:26:46:97:
                    78:34:3f:17:bf:ef:b4:b6:b4:69:f4:b6:c7:03:a9:
                    5b:fe:2b:1a:38:68:0c:1f:3d:9b:70:16:69:d9:fb:
                    75:ff:32:4e:50:ee:1d:39:81:b6:7f:db:48:46:3c:
                    24:e4:bc:59:08:3a:c7:97:09:15:97:ee:04:9a:64:
                    23:18:24:05:59:2f:e0:71:bf:ff:c8:af:ea:a4:41:
                    bb:4c:6e:47:5b:89:b3:98:8f:a2:74:06:56:93:ca:
                    55:40:7e:df:da:13:40:43:22:a2:7e:90:0e:ac:f4:
                    77:69
                Exponent: 65537 (0x10001)
    Signature Algorithm: sha256WithRSAEncryption
         7a:23:17:f5:02:a0:34:6c:a0:c6:c3:24:80:68:91:42:4a:57:
         7b:5a:f2:d0:be:cc:56:ed:d1:3c:47:d9:90:a4:2a:4e:bc:ff:
         ca:cb:fa:a7:bc:96:02:ab:c6:07:74:42:5e:ff:2f:ea:89:67:
         fe:8b:29:e6:58:f5:4e:ea:b1:18:81:43:d7:2b:55:27:ab:22:
         3b:30:30:e1:e6:d3:cb:df:40:aa:96:9f:12:73:a2:2a:88:3a:
         cd:a8:48:ff:66:81:09:77:63:90:ac:ee:54:84:84:a0:ce:92:
         05:47:7c:83:ea:f2:24:a8:e2:6d:58:1f:ed:ba:28:6e:9f:74:
         4f:08:ad:db:da:8b:dc:60:df:37:8d:04:9f:df:f8:bd:75:c8:
         f2:e8:c4:1c:67:03:cf:51:2c:ba:c4:ee:ee:d8:70:75:af:86:
         bd:90:ce:df:f2:ff:47:86:56:a1:7c:ad:2a:3a:d0:27:3b:da:
         d5:b5:63:dd:71:e0:2a:23:70:c9:ae:91:a7:bb:33:91:00:e2:
         e3:0c:dd:29:f5:31:81:0a:37:63:6d:38:3c:33:43:c6:5d:5b:
         31:ac:ae:df:cc:15:ab:e5:cb:59:32:d6:3e:c2:c6:7c:f0:93:
         38:4f:71:fd:4c:62:b9:46:67:b7:8b:28:4b:0f:d9:9a:90:fb:
         96:5e:12:a5

A diferencia del certificado raíz, vemos que el issuer (certificado raíz) y el subject (certificado intermedio) son diferentes.

Paso 6

Para estar seguro de que lo hemos realizado correctamente vamos a comprobar el certificado intermedio.

openssl verify -CAfile certificadoRaiz.crt certificadoIntermedio.crt

certificadoIntermedio.crt: OK

Certificado final

Paso 1

Generamos el certificado final RSA que contendrá la clave privada cifrada en AES.

openssl genpkey -algorithm RSA -aes256 -out certificadoFinal.key -pkeyopt rsa_keygen_bits:2048

..........................................+++++
...................+++++
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
Paso 2

Hacemos un "cat" para ver nuestra clave privada generada en el paso anterior.

cat certificadoFinal.key

-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFLTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQI3n1R+/GOo3ECAggA
MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBA50vRF+Pt+1D4ywzkUNjgTBIIE
0AoPGQ+xq4bYGxrEERVqVCqU6CPMpYU/+isUKyMNsEKoWiGTXJNTlqnTK4wN82rV
JhPr3tdFmPrwkI29qfiLcgDf2opnQm2pkXhEjpA67UWdFKmDEasS8wW5ro3LagMj
VDXkSfgIGeAxFz1yCcvVrsfpcFleXAWQ4ZAwfxrEzO2sJe5fPa+uKDNhNKXHaScH
WlxqrhxhCAgDs8tptDKi1LfjnXDEvGzkR7DRrrc56aM/WpUCv/a/26zQ6IHUheB6
cupO3zR4yEkq7Fx3aKSvu1RS0y9yIcX+VwIzAdElp989gXNsH2Z9qJHxTf0SlA6X
gppuHMJMEXmuf69ronna3DMwPCwtmOtRPvKp4G8hdoUgXcznIbJfu8Iq76YMTR56
LQ4yw5+USXy291jY2+L7Z657tywL8quvaV1OzXzjfajgDDoYMI70TvsP0HoqBKHF
CPSBK/pwwyziQjppj2rczriWLMWOKP5AnWmelW9RQle6C448UERAYR443VSW3Nzp
KkwFGjNDo8LLYS6M30pn81pTh+YUhRZdi4gh4hwHkJVBUozrxwkjiK4LtYrwWBD3
BGHPqP6FJ4jylSdOGhrsN63WwiiQFMyft/1SREU3iv6MClp4P9Ib019KTFbdtgmC
YTzeGRm80yBl7oEaXqIMdeYv4RrUwzD1TSQd+pXU/Dv2ojmLbDkWS4uYMvZ4EcCD
0x5CcL6JX45BH7e2iRPR4sA31ClB8TWIMjtc/x2g0I6ui3uVayw7MggjQTIgAnB7
IWKtuvLUiSXpLlNXc7dhYqkWNq5jmBvzwWN2otGVAP5etRt10LlF24aghJtpv9IZ
bc5oLloUOTxaIV681t9nKKdFLV9vnp9HwbEPhcL55eYmUJfdVkdZStnM1KYoY+S4
8QBHDBE4NvU04Di7R64ROpGGviGlYRsU6g7AQHL30ErEC78kC/7lknpZYZfXDIbz
M6HLHRJuzIrX+bgvsRpTRa6fCsq9ch1YkkTjPy5lqecPxLQ1tcfLPwXlJCjQsnV1
RY4L4BJbnMpKw9vfDT1q/o2N17D0N2StxzyMHIw+aWF0+pgmF66d9pGfavhaykBu
W+YOlEltX3we07jfIf4AisPoAi5k+iNSextqaQtk+Co2aVkBrh4dRyBmpE/uYRi1
0OWnJJsb1pCUafNreIdS8g6FUxoCzW0hkiSnG9lrHXmNxz3bj2fD1UQtn8z/wJaD
qXpUFGc2zcXtynI9n5FmP5sAfbxPxoSHKf0/tbov6l0ndZJoZ9AY01wmuLwqk889
E+Z0cSmm4xOdDCavqMlkG2OS+rGu04U+TrBN8bFY+lSNnNYmOj09m0AlCVCc0lgM
Zi/LeV9rxIYBrZ/WjT4LVOdDzr6IM0Mm5iFLFKrBwjqLl3XebckGgolIt0zDDZRh
R5Yan1YZnGtXxZrFyy+X0p743MEBAwNU9U6uGP+OTsBupUoUggAmXLExK3oIM1IX
JwEi94m+TmRc0z6ovydqclCb9B2/fiNyhdfoghRDFQTU4a4KHSRDHaJOYxR/4mPv
v/JKrA+MJIJJ+YiPHIsDs1rYo+SkqpqqnsW6cZ6sHCScy4JwmGFYJU8gLTPWJkoE
P0iH+2VAay9UU2K7KnmANYP9o3uEouB268MlrjwDWLi7
-----END ENCRYPTED PRIVATE KEY-----
Paso 3

A continuación generamos una solicitud de firma de certificado.

openssl req -new -key certificadoFinal.key -out certificadoFinal.csr

Enter pass phrase for certificadoFinal.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]:Tenerife
Locality Name (eg, city) []:Tenerife
Organization Name (eg, company) [Internet Widgits Pty Ltd]:estudiantetf
Organizational Unit Name (eg, section) []:estudiantetf 
Common Name (e.g. server FQDN or YOUR name) []:www.estudiantetf.com
Email Address []:correo3@tf.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Paso 4

Hacemos un "cat" para ver el certificado pendiente de firma.

cat certificadoFinal.csr

-----BEGIN CERTIFICATE REQUEST-----
MIIC5TCCAc0CAQAwgZ8xCzAJBgNVBAYTAkVTMREwDwYDVQQIDAhUZW5lcmlmZTER
MA8GA1UEBwwIVGVuZXJpZmUxFTATBgNVBAoMDGVzdHVkaWFudGV0ZjEVMBMGA1UE
CwwMZXN0dWRpYW50ZXRmMR0wGwYDVQQDDBR3d3cuZXN0dWRpYW50ZXRmLmNvbTEd
MBsGCSqGSIb3DQEJARYOY29ycmVvM0B0Zi5jb20wggEiMA0GCSqGSIb3DQEBAQUA
A4IBDwAwggEKAoIBAQCkOIgHcmhQjCeWCwJrs5b2qKuu2DJu4xXBwJpIKHh2icH9
VaPsuUjGE1yMXyhO5plydvtbvCyjVCDSH6zUnEl7SCH6fNk9gB+nmTQ1u0hjseNW
zRNfw3MsVLHVgsBSdn960RSLO/uzYvJUpmvRqU3Az9oipB2wrRF07YlR5QvaOokd
jwdOlskqo9qG/dZcpVf1cVhBtOlfs7+8D9ccN4WyD0cE+rKlwPF0ArcmckLz7uwD
xO4v6n9Gh62PX5whgCkUxXun4T8O9k1h9Rb/kkPQZZfgnFJi3ng1Maa3Sxmnk1I3
p4udmcEb48+JQhRpwRkWzFVMi3wuDn/q7tzad7B1AgMBAAGgADANBgkqhkiG9w0B
AQsFAAOCAQEACGE5iJWotxCBY8/MP6xJVpZb4/1HNGeCa2XSNPXw3BwKFYT6Pm6Q
mvA0HLLG5mysPOKl77PAtmvK2BmJJHMC+t3qlGMzmIIYOjWl0RaskxSloGa8dJB8
WuwlK2F37ss8BRTkZT2lVfiaGou073x7XSKRJSGDbuuTlSwHiL0NSCIUzWr8qjmb
Jb4mdKksesKblX8l1hmaU3Y4xIjv9ts8bLgi2aSQtvzvg8O0uio/6nv7pLwIUpmO
LZHMXY7ELhCGp+NbNTg8IUTJQhlHKTtq7CfEfGsKJYxLXTxqVtvpT1m9zQxsIa4h
unJ2xh9mnhoCeH5BKZCqWTyM2cG2G/oifw==
-----END CERTIFICATE REQUEST-----
Paso 5

Firmamos el certificado final con la clave privada del certificado intermedio.

openssl x509 -req -days 360 -in certificadoFinal.csr -CA certificadoIntermedio.crt -CAkey certificadoIntermedio.key -CAcreateserial -out certificadoFinal.crt

Signature ok
subject=C = ES, ST = Tenerife, L = Tenerife, O = estudiantetf, OU = estudiantetf, CN = www.estudiantetf.com, emailAddress = correo3@tf.com
Getting CA Private Key
Enter pass phrase for certificadoIntermedio.key:

Para verificar este certificado tenemos que ir al apartado siguiente. Aunque podemos ver con detalle los datos del certificado final como hemos hecho con los dos anteriores.

Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number:
            21:1c:7c:90:69:98:8e:09:0c:e3:b7:55:77:fb:5d:8b:b0:04:f3:6f
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = ES, ST = Sevilla, L = Sevilla, O = estudiantesevilla, OU = estudiantesevilla, CN = www.estudiantesevilla.com, emailAddress = correo2@sevilla.com
        Validity
            Not Before: Dec 18 18:13:59 2018 GMT
            Not After : Dec 13 18:13:59 2019 GMT
        Subject: C = ES, ST = Tenerife, L = Tenerife, O = estudiantetf, OU = estudiantetf, CN = www.estudiantetf.com, emailAddress = correo3@tf.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:a4:38:88:07:72:68:50:8c:27:96:0b:02:6b:b3:
                    96:f6:a8:ab:ae:d8:32:6e:e3:15:c1:c0:9a:48:28:
                    78:76:89:c1:fd:55:a3:ec:b9:48:c6:13:5c:8c:5f:
                    28:4e:e6:99:72:76:fb:5b:bc:2c:a3:54:20:d2:1f:
                    ac:d4:9c:49:7b:48:21:fa:7c:d9:3d:80:1f:a7:99:
                    34:35:bb:48:63:b1:e3:56:cd:13:5f:c3:73:2c:54:
                    b1:d5:82:c0:52:76:7f:7a:d1:14:8b:3b:fb:b3:62:
                    f2:54:a6:6b:d1:a9:4d:c0:cf:da:22:a4:1d:b0:ad:
                    11:74:ed:89:51:e5:0b:da:3a:89:1d:8f:07:4e:96:
                    c9:2a:a3:da:86:fd:d6:5c:a5:57:f5:71:58:41:b4:
                    e9:5f:b3:bf:bc:0f:d7:1c:37:85:b2:0f:47:04:fa:
                    b2:a5:c0:f1:74:02:b7:26:72:42:f3:ee:ec:03:c4:
                    ee:2f:ea:7f:46:87:ad:8f:5f:9c:21:80:29:14:c5:
                    7b:a7:e1:3f:0e:f6:4d:61:f5:16:ff:92:43:d0:65:
                    97:e0:9c:52:62:de:78:35:31:a6:b7:4b:19:a7:93:
                    52:37:a7:8b:9d:99:c1:1b:e3:cf:89:42:14:69:c1:
                    19:16:cc:55:4c:8b:7c:2e:0e:7f:ea:ee:dc:da:77:
                    b0:75
                Exponent: 65537 (0x10001)
    Signature Algorithm: sha256WithRSAEncryption
         48:d8:73:d7:f0:9d:74:fa:34:f6:c5:9a:9c:ff:b4:ad:fe:86:
         29:68:4e:ca:33:df:d8:8a:e3:68:c2:87:b1:8b:de:b9:1c:44:
         b7:69:b2:25:7f:a5:d1:9a:8b:57:d5:29:23:3f:63:1d:a2:16:
         23:1e:16:5b:b1:23:1f:96:7b:90:83:d6:01:27:2c:db:30:dc:
         57:06:0b:4f:1d:3e:95:95:75:fb:9b:b3:c9:57:05:ad:9e:90:
         3e:dc:48:e7:83:93:d3:12:65:38:fa:90:45:a9:46:05:af:4e:
         e7:84:0b:52:fb:e2:ce:57:ac:a0:1b:7d:9d:ef:2d:4a:07:f2:
         8e:3f:5d:6e:1e:a6:47:c3:77:7f:16:69:0a:43:89:4c:a8:e3:
         40:59:82:da:1c:78:f4:09:84:e0:22:ff:00:16:ae:aa:15:4e:
         42:fb:51:23:d1:19:d2:2b:e8:ce:24:b6:38:0a:b7:43:00:f2:
         53:8c:9e:15:28:1c:d5:82:b3:d8:b9:0c:01:48:7f:94:a4:30:
         84:d8:cf:05:b8:a2:da:bc:f6:61:c2:09:4a:7e:9d:ce:90:2f:
         fc:01:76:e6:4c:c0:b0:44:ee:22:1e:43:a3:ed:56:64:28:c9:
         e0:7a:2b:19:71:26:2e:9d:78:4a:f1:71:31:25:60:bb:13:6a:
         8d:cf:ff:a1

En este caso, el issuer es el certificado intermedio y el subject es el certificado final.


Certificado "chain"

En este apartado, concatenamos el certificado intermedio con el certificado final para verificar que este último se ha generado correctamente.

Paso 1

Este certificado simplemente será la unión del certificado raíz con el certificado intermedio.

cat certificadoIntermedio.crt certificadoRaiz.crt > chain.crt

Paso 2

Hacemos un "cat" para ver el certificado.

cat chain.crt

-----BEGIN CERTIFICATE-----
MIID7zCCAtcCFEVFrQeUNQmfQ2ln5nkBt2UjvdUZMA0GCSqGSIb3DQEBCwUAMIG1
MQswCQYDVQQGEwJFUzETMBEGA1UECAwKTGFzIFBhbG1hczEjMCEGA1UEBwwaTGFz
IFBhbG1hcyBkZSBHcmFuIENhbmFyaWExFTATBgNVBAoMDGVzdHVkaWFudGVTTDEV
MBMGA1UECwwMZXN0dWRpYW50ZVNMMR0wGwYDVQQDDBR3d3cuZXN0dWRpYW50ZVNM
LmNvbTEfMB0GCSqGSIb3DQEJARYQY29ycmVvMUB1bHBnYy5lczAeFw0xODEyMTgx
NjI5MzVaFw0xOTEyMTMxNjI5MzVaMIGxMQswCQYDVQQGEwJFUzEQMA4GA1UECAwH
U2V2aWxsYTEQMA4GA1UEBwwHU2V2aWxsYTEaMBgGA1UECgwRZXN0dWRpYW50ZXNl
dmlsbGExGjAYBgNVBAsMEWVzdHVkaWFudGVzZXZpbGxhMSIwIAYDVQQDDBl3d3cu
ZXN0dWRpYW50ZXNldmlsbGEuY29tMSIwIAYJKoZIhvcNAQkBFhNjb3JyZW8yQHNl
dmlsbGEuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtEv7NhX2
NfQw7frtzjsdSA5QYg7TIQAtVnciEXmijbzWbokgW+f6CJ+85JdwYy37A9Xnyza+
+ZTV51rDYh7VfvYn8ibZUvlEM44laACqzZwZJUqNLDCl/1ZikRvqo0IedcgQkG80
DeZUdgAXGwpLKRRjLt7d4qT5DJ5OpI6Wc1z25VRZ4zA+HWC75uqgKfmqVpYmRpd4
ND8Xv++0trRp9LbHA6lb/isaOGgMHz2bcBZp2ft1/zJOUO4dOYG2f9tIRjwk5LxZ
CDrHlwkVl+4EmmQjGCQFWS/gcb//yK/qpEG7TG5HW4mzmI+idAZWk8pVQH7f2hNA
QyKifpAOrPR3aQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQB6Ixf1AqA0bKDGwySA
aJFCSld7WvLQvsxW7dE8R9mQpCpOvP/Ky/qnvJYCq8YHdEJe/y/qiWf+iynmWPVO
6rEYgUPXK1UnqyI7MDDh5tPL30Cqlp8Sc6IqiDrNqEj/ZoEJd2OQrO5UhISgzpIF
R3yD6vIkqOJtWB/tuihun3RPCK3b2ovcYN83jQSf3/i9dcjy6MQcZwPPUSy6xO7u
2HB1r4a9kM7f8v9HhlahfK0qOtAnO9rVtWPdceAqI3DJrpGnuzORAOLjDN0p9TGB
CjdjbTg8M0PGXVsxrK7fzBWr5ctZMtY+wsZ88JM4T3H9TGK5Rme3iyhLD9makPuW
XhKl
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIID2TCCAsECFCEcfJBpmI4JDOO3VXf7XYuwBPNvMA0GCSqGSIb3DQEBCwUAMIGx
MQswCQYDVQQGEwJFUzEQMA4GA1UECAwHU2V2aWxsYTEQMA4GA1UEBwwHU2V2aWxs
YTEaMBgGA1UECgwRZXN0dWRpYW50ZXNldmlsbGExGjAYBgNVBAsMEWVzdHVkaWFu
dGVzZXZpbGxhMSIwIAYDVQQDDBl3d3cuZXN0dWRpYW50ZXNldmlsbGEuY29tMSIw
IAYJKoZIhvcNAQkBFhNjb3JyZW8yQHNldmlsbGEuY29tMB4XDTE4MTIxODE4MTM1
OVoXDTE5MTIxMzE4MTM1OVowgZ8xCzAJBgNVBAYTAkVTMREwDwYDVQQIDAhUZW5l
cmlmZTERMA8GA1UEBwwIVGVuZXJpZmUxFTATBgNVBAoMDGVzdHVkaWFudGV0ZjEV
MBMGA1UECwwMZXN0dWRpYW50ZXRmMR0wGwYDVQQDDBR3d3cuZXN0dWRpYW50ZXRm
LmNvbTEdMBsGCSqGSIb3DQEJARYOY29ycmVvM0B0Zi5jb20wggEiMA0GCSqGSIb3
DQEBAQUAA4IBDwAwggEKAoIBAQCkOIgHcmhQjCeWCwJrs5b2qKuu2DJu4xXBwJpI
KHh2icH9VaPsuUjGE1yMXyhO5plydvtbvCyjVCDSH6zUnEl7SCH6fNk9gB+nmTQ1
u0hjseNWzRNfw3MsVLHVgsBSdn960RSLO/uzYvJUpmvRqU3Az9oipB2wrRF07YlR
5QvaOokdjwdOlskqo9qG/dZcpVf1cVhBtOlfs7+8D9ccN4WyD0cE+rKlwPF0Arcm
ckLz7uwDxO4v6n9Gh62PX5whgCkUxXun4T8O9k1h9Rb/kkPQZZfgnFJi3ng1Maa3
Sxmnk1I3p4udmcEb48+JQhRpwRkWzFVMi3wuDn/q7tzad7B1AgMBAAEwDQYJKoZI
hvcNAQELBQADggEBAEjYc9fwnXT6NPbFmpz/tK3+hiloTsoz39iK42jCh7GL3rkc
RLdpsiV/pdGai1fVKSM/Yx2iFiMeFluxIx+We5CD1gEnLNsw3FcGC08dPpWVdfub
s8lXBa2ekD7cSOeDk9MSZTj6kEWpRgWvTueEC1L74s5XrKAbfZ3vLUoH8o4/XW4e
pkfDd38WaQpDiUyo40BZgtocePQJhOAi/wAWrqoVTkL7USPRGdIr6M4ktjgKt0MA
8lOMnhUoHNWCs9i5DAFIf5SkMITYzwW4otq89mHCCUp+nc6QL/wBduZMwLBE7iIe
Q6PtVmQoyeB6KxlxJi6deErxcTElYLsTao3P/6E=
-----END CERTIFICATE-----
Paso 3

Procedemos a la verificación del certificado.

openssl verify -CAfile certificadoRaiz.crt chain.crt

chain.cert: OK 

Cadena de certificados en un solo fichero

En este caso, formaremos un solo fichero ".pem" que contendrá los tres certificados creados anteriormente. Es muy importante concatenarlos en el orden que se indica a continuación, sino daría errores como:

error 20 at 0 depth lookup: unable to get local issuer certificate
error todos.cert: verification failed
Paso 1

Juntamos los tres certificados en un solo fichero.

cat certificadoRaiz.crt certificadoIntermedio.crt certificadoFinal.crt > todos.crt

Paso 2

Vemos el contenido del fichero creado.

cat todos.crt

-----BEGIN CERTIFICATE-----
MIID8zCCAtsCFDlAjnGUjKoNdFgXQEvpAVygTpgWMA0GCSqGSIb3DQEBCwUAMIG1
MQswCQYDVQQGEwJFUzETMBEGA1UECAwKTGFzIFBhbG1hczEjMCEGA1UEBwwaTGFz
IFBhbG1hcyBkZSBHcmFuIENhbmFyaWExFTATBgNVBAoMDGVzdHVkaWFudGVTTDEV
MBMGA1UECwwMZXN0dWRpYW50ZVNMMR0wGwYDVQQDDBR3d3cuZXN0dWRpYW50ZVNM
LmNvbTEfMB0GCSqGSIb3DQEJARYQY29ycmVvMUB1bHBnYy5lczAeFw0xODEyMTgx
NjA0NDVaFw0zODEyMTMxNjA0NDVaMIG1MQswCQYDVQQGEwJFUzETMBEGA1UECAwK
TGFzIFBhbG1hczEjMCEGA1UEBwwaTGFzIFBhbG1hcyBkZSBHcmFuIENhbmFyaWEx
FTATBgNVBAoMDGVzdHVkaWFudGVTTDEVMBMGA1UECwwMZXN0dWRpYW50ZVNMMR0w
GwYDVQQDDBR3d3cuZXN0dWRpYW50ZVNMLmNvbTEfMB0GCSqGSIb3DQEJARYQY29y
cmVvMUB1bHBnYy5lczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPRC
7OCckp5t7VhiqZNl0ZR4zXpSzXWS9W/0tsCnGgGzIdLSFFN/+wytavR0CLW9vQgA
OSd6B7P94Gkdf9aWYvKIe6jBVG6Q2qo/FffyK/2uGC6d+XrcwHgDMyN9i/Hky6ju
XqCXlUuJPCukusBeWHaBMEwNS13dFyyy80170XNWJs3ykRvihV/xKHCMUFOJEkKW
hhYHzMCH+4wwVmIe1Gf/oFQygBT5oQ81cQLqRGQiJYy5uFy8Gw/tvmtxV1q9PDRQ
3Z/DQSclsS0OCtcAF/RK5kQ3jUHHvazACOhy/sQVtzmsrQKQypCOWmIGwqCASc2o
dhzpZV0hCs3RE/7guTcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEACkTrCDwpnR5w
CD6u876G8EXfa04zYtprQGZlEF7v2+f2X1eSVVrkyzmbsiXKwbNyTcJYHZGtLKct
qblaD/ng1HCGBCP+Ih3T1ZdrfKj0MjeoR7z8wfJcZ4kFxfyiRKLpWXdxWQQu+t9t
VpxFZKy+XtQzMG9jGz0hb2Xa35ocXCdUwI4LV0hQh6Of7WWdH3eSC3rj7WjfmsH7
gAVU9h3cPadzxfxBA6g28kCWVnNX5FUaxbaUWh8Zeq8O68AyKzABaS3J3KwqvcrE
hoaBpZn1HU/Ypl9Ncpc2FWr1KKEY2ad7yYnR7sn2qV8pUry5LLT4TUgdYj5Ph7Gl
9ZCSj/2j5w==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIID7zCCAtcCFEVFrQeUNQmfQ2ln5nkBt2UjvdUZMA0GCSqGSIb3DQEBCwUAMIG1
MQswCQYDVQQGEwJFUzETMBEGA1UECAwKTGFzIFBhbG1hczEjMCEGA1UEBwwaTGFz
IFBhbG1hcyBkZSBHcmFuIENhbmFyaWExFTATBgNVBAoMDGVzdHVkaWFudGVTTDEV
MBMGA1UECwwMZXN0dWRpYW50ZVNMMR0wGwYDVQQDDBR3d3cuZXN0dWRpYW50ZVNM
LmNvbTEfMB0GCSqGSIb3DQEJARYQY29ycmVvMUB1bHBnYy5lczAeFw0xODEyMTgx
NjI5MzVaFw0xOTEyMTMxNjI5MzVaMIGxMQswCQYDVQQGEwJFUzEQMA4GA1UECAwH
U2V2aWxsYTEQMA4GA1UEBwwHU2V2aWxsYTEaMBgGA1UECgwRZXN0dWRpYW50ZXNl
dmlsbGExGjAYBgNVBAsMEWVzdHVkaWFudGVzZXZpbGxhMSIwIAYDVQQDDBl3d3cu
ZXN0dWRpYW50ZXNldmlsbGEuY29tMSIwIAYJKoZIhvcNAQkBFhNjb3JyZW8yQHNl
dmlsbGEuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtEv7NhX2
NfQw7frtzjsdSA5QYg7TIQAtVnciEXmijbzWbokgW+f6CJ+85JdwYy37A9Xnyza+
+ZTV51rDYh7VfvYn8ibZUvlEM44laACqzZwZJUqNLDCl/1ZikRvqo0IedcgQkG80
DeZUdgAXGwpLKRRjLt7d4qT5DJ5OpI6Wc1z25VRZ4zA+HWC75uqgKfmqVpYmRpd4
ND8Xv++0trRp9LbHA6lb/isaOGgMHz2bcBZp2ft1/zJOUO4dOYG2f9tIRjwk5LxZ
CDrHlwkVl+4EmmQjGCQFWS/gcb//yK/qpEG7TG5HW4mzmI+idAZWk8pVQH7f2hNA
QyKifpAOrPR3aQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQB6Ixf1AqA0bKDGwySA
aJFCSld7WvLQvsxW7dE8R9mQpCpOvP/Ky/qnvJYCq8YHdEJe/y/qiWf+iynmWPVO
6rEYgUPXK1UnqyI7MDDh5tPL30Cqlp8Sc6IqiDrNqEj/ZoEJd2OQrO5UhISgzpIF
R3yD6vIkqOJtWB/tuihun3RPCK3b2ovcYN83jQSf3/i9dcjy6MQcZwPPUSy6xO7u
2HB1r4a9kM7f8v9HhlahfK0qOtAnO9rVtWPdceAqI3DJrpGnuzORAOLjDN0p9TGB
CjdjbTg8M0PGXVsxrK7fzBWr5ctZMtY+wsZ88JM4T3H9TGK5Rme3iyhLD9makPuW
XhKl
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIID2TCCAsECFCEcfJBpmI4JDOO3VXf7XYuwBPNvMA0GCSqGSIb3DQEBCwUAMIGx
MQswCQYDVQQGEwJFUzEQMA4GA1UECAwHU2V2aWxsYTEQMA4GA1UEBwwHU2V2aWxs
YTEaMBgGA1UECgwRZXN0dWRpYW50ZXNldmlsbGExGjAYBgNVBAsMEWVzdHVkaWFu
dGVzZXZpbGxhMSIwIAYDVQQDDBl3d3cuZXN0dWRpYW50ZXNldmlsbGEuY29tMSIw
IAYJKoZIhvcNAQkBFhNjb3JyZW8yQHNldmlsbGEuY29tMB4XDTE4MTIxODE4MTM1
OVoXDTE5MTIxMzE4MTM1OVowgZ8xCzAJBgNVBAYTAkVTMREwDwYDVQQIDAhUZW5l
cmlmZTERMA8GA1UEBwwIVGVuZXJpZmUxFTATBgNVBAoMDGVzdHVkaWFudGV0ZjEV
MBMGA1UECwwMZXN0dWRpYW50ZXRmMR0wGwYDVQQDDBR3d3cuZXN0dWRpYW50ZXRm
LmNvbTEdMBsGCSqGSIb3DQEJARYOY29ycmVvM0B0Zi5jb20wggEiMA0GCSqGSIb3
DQEBAQUAA4IBDwAwggEKAoIBAQCkOIgHcmhQjCeWCwJrs5b2qKuu2DJu4xXBwJpI
KHh2icH9VaPsuUjGE1yMXyhO5plydvtbvCyjVCDSH6zUnEl7SCH6fNk9gB+nmTQ1
u0hjseNWzRNfw3MsVLHVgsBSdn960RSLO/uzYvJUpmvRqU3Az9oipB2wrRF07YlR
5QvaOokdjwdOlskqo9qG/dZcpVf1cVhBtOlfs7+8D9ccN4WyD0cE+rKlwPF0Arcm
ckLz7uwDxO4v6n9Gh62PX5whgCkUxXun4T8O9k1h9Rb/kkPQZZfgnFJi3ng1Maa3
Sxmnk1I3p4udmcEb48+JQhRpwRkWzFVMi3wuDn/q7tzad7B1AgMBAAEwDQYJKoZI
hvcNAQELBQADggEBAEjYc9fwnXT6NPbFmpz/tK3+hiloTsoz39iK42jCh7GL3rkc
RLdpsiV/pdGai1fVKSM/Yx2iFiMeFluxIx+We5CD1gEnLNsw3FcGC08dPpWVdfub
s8lXBa2ekD7cSOeDk9MSZTj6kEWpRgWvTueEC1L74s5XrKAbfZ3vLUoH8o4/XW4e
pkfDd38WaQpDiUyo40BZgtocePQJhOAi/wAWrqoVTkL7USPRGdIr6M4ktjgKt0MA
8lOMnhUoHNWCs9i5DAFIf5SkMITYzwW4otq89mHCCUp+nc6QL/wBduZMwLBE7iIe
Q6PtVmQoyeB6KxlxJi6deErxcTElYLsTao3P/6E=
-----END CERTIFICATE-----
Paso 3

openssl verify -CAfile certificadoRaiz.crt todos.crt

todos.cert: OK

PEM a PKCS#12

Como se ha comentado en este documento, el formato "PKCS#12" almacena claves privadas y certificados en un solo archivo cifrado. Por ello, vamos a mostrar como se pasa de un formato a otro (usaremos el certificado intermedio para el ejemplo).

Paso 1

Tener en cuenta que se nos pedirá la contraseña que usamos para proteger la clave y nos dará la posibilidad de cambiarla por una nueva. En "-inkey" se deberá introducir la clave privada y en "-in" el certificado correspondiente a dicha clave (en caso contrario, clave y certificado no coincidirían y nos daría error).

openssl pkcs12 -export -in certificadoIntermedio.crt -inkey certificadoIntermedio.key -out inter.p12

Enter pass phrase for certificadoIntermedio.key:
Enter Export Password:
Verifying - Enter Export Password:
Paso 2

Si hacemos un "cat" veremos que esta en binario y se hace imposible enter su contenido por eso siempre se recomienda usar ".pem".

Una vez en este formato, el certificado podrá ser importado junto con su clave privada en navegadores, agentes de correo, etc. No olvidemos que se solicitará la contraseña de protección de la clave privada.

Referencias

Plantilla:Listaref

  1. Colaboradores de Wikipedia. Función hash [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 5 de noviembre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Funci%C3%B3n_hash&oldid=107845867>.
  2. Estilo ISO de citas bibliográficas Colaboradores de Wikipedia. Función hash criptográfica [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 5 de noviembre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Funci%C3%B3n_hash_criptogr%C3%A1fica&oldid=108461646>.
  3. D. Eloi Sanfelix. Curso de privacidad y protección de comunicaciones digitales [en línea]. Universidad Politécnica de Madrid, 2013 [fecha de consulta: 5 de noviembre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Funci%C3%B3n_hash_criptogr%C3%A1fica&oldid=108461646>.
  4. Estilo ISO de citas bibliográficas Colaboradores de Wikipedia. Función hash criptográfica [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 5 de noviembre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Funci%C3%B3n_hash_criptogr%C3%A1fica&oldid=108461646>.
  5. MD5. (2018, 11 de septiembre). Wikipedia, La enciclopedia libre. Fecha de consulta: 16:43, noviembre 5, 2018 desde https://es.wikipedia.org/w/index.php?title=MD5&oldid=110565562.
  6. Wikipedia contributors. (2018, October 28). SHA-1. In Wikipedia, The Free Encyclopedia. Retrieved 15:50, November 5, 2018, from https://en.wikipedia.org/w/index.php?title=SHA-1&oldid=866182340
  7. Colaboradores de Wikipedia. SHA-2 [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 15 de noviembre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=SHA-2&oldid=110395255>.
  8. Colaboradores de Wikipedia. (2018, 4 de noviembre). SHA-3. En Wikipedia, la Enciclopedia Libre . Consultado a las 17:27, 15 de noviembre de 2018, de https://en.wikipedia.org/w/index.php?title=SHA-3&oldid=867303479
  9. Colaboradores de Wikipedia. (2018, 18 de octubre). Código de autenticación de mensaje. En Wikipedia, la Enciclopedia Libre . Consultado el 12:59, 3 de noviembre de 2018, de https://en.wikipedia.org/w/index.php?title=Message_authentication_code&oldid=864554738
  10. Colaboradores de Wikipedia. (2018, 26 de octubre). HMAC. En Wikipedia, la Enciclopedia Libre . Consultado a las 13:00, 3 de noviembre de 2018, de https://en.wikipedia.org/w/index.php?title=HMAC&oldid=865863320
  11. Criptografía simétrica. (2018, 3 de julio). Wikipedia, La enciclopedia libre. Fecha de consulta: 17:08, octubre 11, 2018 desde https://es.wikipedia.org/w/index.php?title=Criptograf%C3%ADa_sim%C3%A9trica&oldid=109083984.
  12. Colaboradores de Wikipedia. (2018, 27 de octubre). PBKDF2. En Wikipedia, la Enciclopedia Libre . Obtenido 18:55, 1 de noviembre de 2018, de https://en.wikipedia.org/w/index.php?title=PBKDF2&oldid=866007861
  13. Colaboradores de Wikipedia. OpenSSL Wiki [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 17 de diciembre del 2018]. Disponible en <https://wiki.openssl.org/index.php/Main_Page>.
  14. Colaboradores de Wikipedia. Cifrado por bloques [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 24 de octubre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Cifrado_por_bloques&oldid=105539415>.
  15. Colaboradores de Wikipedia. Vector de inicialización [en línea]. Wikipedia, La enciclopedia libre, 2015 [fecha de consulta: 25 de octubre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Vector_de_inicializaci%C3%B3n&oldid=79449760>.
  16. Colaboradores del Blog de Daniel Lerch. Modos de cifrado: ECB, CBC, CTR, OFB y CFB. [en línea]. El Blog de Daniel Lerch, 2007 [fecha de consulta: 12 de octubre del 2018]. Disponible en <http://dlerch.blogspot.com/2007/07/modos-de-cifrado-ecb-cbc-ctr-ofb-y-cfb.html>.
  17. Colaboradores del Blog de Daniel Lerch. Modos de cifrado: ECB, CBC, CTR, OFB y CFB. [en línea]. El Blog de Daniel Lerch, 2007 [fecha de consulta: 12 de octubre del 2018]. Disponible en <http://dlerch.blogspot.com/2007/07/modos-de-cifrado-ecb-cbc-ctr-ofb-y-cfb.html>
  18. Wikipedia contributors. (2018, October 16). Block cipher mode of operation. In Wikipedia, The Free Encyclopedia. Retrieved 17:43, October 25, 2018, from https://en.wikipedia.org/w/index.php?title=Block_cipher_mode_of_operation&oldid=864354561
  19. Colaboradores de Wikipedia. Cifrado por bloques [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 25 de octubre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Cifrado_por_bloques&oldid=105539415>.
  20. Colaboradores de Wikipedia. Modos de operación de una unidad de cifrado por bloques [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 13 de octubre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Modos_de_operaci%C3%B3n_de_una_unidad_de_cifrado_por_bloques&oldid=108270945>.
  21. Wikipedia contributors. (2018, October 30). Block cipher mode of operation. In Wikipedia, The Free Encyclopedia. Retrieved 19:21, November 2, 2018, from https://en.wikipedia.org/w/index.php?title=Block_cipher_mode_of_operation&oldid=866522235
  22. Colaboradores de Wikipedia. Data Encryption Standard [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 12 de octubre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Data_Encryption_Standard&oldid=109510549>.
  23. Colaboradores de Wikipedia. Triple DES [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 13 de octubre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Triple_DES&oldid=107652683>.
  24. Colaboradores de Wikipedia. Advanced Encryption Standard [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 14 de octubre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Advanced_Encryption_Standard&oldid=110119865>.
  25. Colaboradores de Boxcryptor. Cifrado AES y RSA [en línea]. Boxcryptor [fecha de consulta: 14 de octubre del 2018]. Disponible en <https://www.boxcryptor.com/es/encryption/>.
  26. Colaboradores de Wikipedia. Cifrador de flujo [en línea]. Wikipedia, La enciclopedia libre, 2016 [fecha de consulta: 25 de octubre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Cifrador_de_flujo&oldid=94383885>.
  27. RSA. (2018, 26 de octubre). Wikipedia, La enciclopedia libre. Fecha de consulta: 17:31, noviembre 7, 2018 desde https://es.wikipedia.org/w/index.php?title=RSA&oldid=111566892.
  28. Criptografía y Seguridad en Computadores. (2015, 5 de mayo). Wikipedia, La enciclopedia libre. Fecha de consulta: 17:31, noviembre 7, 2018.
  29. Colaboradores de Wikipedia. DSA [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 7 de noviembre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=DSA&oldid=109487521>.
  30. Colaboradores de Wikipedia. (2018, 22 de octubre). Algoritmo de firma digital. En Wikipedia, la Enciclopedia Libre . Consultado a las 18:51, 7 de noviembre de 2018, de https://en.wikipedia.org/w/index.php?title=Digital_Signature_Algorithm&oldid=865188446
  31. Colaboradores de Wikipedia. Diffie-Hellman [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 15 de noviembre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Diffie-Hellman&oldid=107390867>.
  32. Colaboradores de Wikipedia. (2018, 6 de noviembre). Criptografía de curva elíptica. En Wikipedia, la Enciclopedia Libre . Consultado a las 18:13, 15 de noviembre de 2018, de https://en.wikipedia.org/w/index.php?title=Elliptic-curve_cryptography&oldid=867536222
  33. Colaboradores de Wikipedia. ECDSA [en línea]. Wikipedia, La enciclopedia libre, 2017 [fecha de consulta: 15 de noviembre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=ECDSA&oldid=96631617>.
  34. Colaboradores de Wikipedia. (2018, 10 de octubre). Secreto compartido. En Wikipedia, la Enciclopedia Libre . Recuperado 18:21, 15 de noviembre de 2018, de https://en.wikipedia.org/w/index.php?title=Shared_secret&oldid=863386628
  35. Wikipedia contributors. (2018, April 12). Elliptic-curve Diffie–Hellman. In Wikipedia, The Free Encyclopedia. Retrieved 18:22, November 15, 2018, from https://en.wikipedia.org/w/index.php?title=Elliptic-curve_Diffie%E2%80%93Hellman&oldid=836070673
  36. Matt. (2018, December 24). Command Line Elliptic Curve Operations. Wiki OpenSSL. Retrieved 12:50, Decemeber 26, 2018, from https://wiki.openssl.org/index.php?title=Command_Line_Elliptic_Curve_Operations&oldid=2734
  37. Colaboradores de Wikipedia. S/MIME [en línea]. Wikipedia, La enciclopedia libre, 2016 [fecha de consulta: 26 de noviembre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=S/MIME&oldid=95828159>.
  38. Wikipedia contributors. (2018, November 21). PKCS 12. In Wikipedia, The Free Encyclopedia. Retrieved 16:56, November 23, 2018, from https://en.wikipedia.org/w/index.php?title=PKCS_12&oldid=869927894