En el corto tutorial de hoy vamos a ver cómo generar una clave pública y privada para el sistema criptográfico RSA.
Técnicamente hablando usaremos openssl para generar una clave privada RSA y luego vamos a derivar la clave pública de esta misma.
Generando clave privada
Para generar una clave privada usamos genrsa
indicando el archivo en donde la clave será guardada y la longitud en bits.
Por ejemplo:
openssl genrsa -out clave_privada.pem 3072
Eso generará una clave privada RSA en el archivo clave_privada.pem
de 3072 bits.
En este caso la salida es algo así (yo comparto la clave privada porque no la usaré para otra cosa, tú nunca compartas la tuya y si lo haces genera otra):
Recuerda que esa clave fue guardada en clave_privada.pem
, ahora vamos a derivar la pública. Con el ejemplo:
openssl rsa -in clave_privada.pem -pubout -out clave_publica.pem
En este caso la clave de entrada es clave_privada.pem
y vamos a colocar la clave pública en clave_publica.pem.
El archivo tiene el siguiente contenido:
Y con eso has generado un par de claves RSA. Ahora puedes encriptar usando criptografía asimétrica o firmar algo de manera digital.
Recuerda que nunca debes compartir tu clave privada, esa debe estar en un lugar seguro. Tampoco debes reutilizar claves, y si has expuesto una, mejor vuelve a generar el par.
Por cierto, entre más bits más seguridad pero necesitarás más poder de procesamiento.
Con OpenSSL versión 3
A partir de la versión 3 de OpenSSL, el formato por defecto para las claves privadas es el PKCS#8. Si tú quieres mantener el formato anterior PKCS#1 puedes convertir la clave generada así:
openssl pkey -in clave_privada.pem -traditional -out clave_privada_tradicional.pem
La diferencia entre PKCS 1 y 8, es que para el caso de PKCS#1 su encabezado comienza con —–BEGIN RSA PRIVATE KEY—–, pero en el caso de PKCS#8 su encabezado comienza con —–BEGIN PRIVATE KEY—–. Básicamente la diferencia es el “RSA”.
Para el caso de la clave pública, una vez que haya sido derivada de la clave privada en formato PKCS#8, ejecuta:
openssl rsa -pubin -in clave_publica.pem -RSAPublicKey_out -out clave_publica_tradicional.pem
Te repito que esto es solo para cuando necesitas el par de clave específicamente en PKCS#1, ya que el PKCS#8 es mejor.
Otra alternativa
También he probado el siguiente comando que funciona perfectamente con las últimas versiones de OpenSSL.
Para la clave privada:
openssl genpkey -algorithm RSA -out clave_privada.pem -pkeyopt rsa_keygen_bits:2048
Para la clave pública:
openssl rsa -pubout -in clave_privada.pem -out clave_publica.pem