¿Cómo convierto una clave pública ssh-keygen en un formato que consume la función PEM_read_bio_RSA_PUBKEY () de openssl?

49

Tengo un problema al generar una clave pública que la PEM_read_bio_RSA_PUBKEY()función openssl puede consumir. Sigo recibiendo errores.

Obviamente, no puedo simplemente usar la cadena ASCII en el ssh-keygen <>.pubarchivo de clave, ya que está en formato de archivo SSH o tal vez la SubjectPublicKeyInfoestructura.

Aquí está el código genérico clave: ssh-keygen -t rsa -b 1024 -C "Test Key"

Encontré un convertidor en php en la web que convertirá el contenido de la clave pública en un formato de cadena base64 PEM ASCII. Sin embargo, la función todavía no le gusta.

La documentación de Openssl establece:

  1. "Función RSA_PUBKEY () que procesa una clave pública utilizando una estructura EVP_PKEY"
  2. "Las funciones RSA_PUBKEY también procesan una clave pública RSA utilizando una estructura RSA"

¿Cómo obtengo mi clave pública OpenSSH en cualquier formato que la función OpenSSL la consuma?

PeteP
fuente
Entendido: use la herramienta openssl solo como tal:
PeteP
Crear clave privada: openssl genrsa -out test.priv.key 2048; Clave pública de salida en el mismo formato (PEM?): Openssl rsa -in test.priv.key -pubout -out test.pub.key
PeteP
Cross-related security.stackexchange.com/questions/32768/…
dave_thompson_085

Respuestas:

57

¡OKAY!

Así que entré en este pensamiento "Fácil, tengo esto". Resulta que hay mucho más de lo que pensaba.

Entonces, el primer problema es que (de acuerdo con las páginas de manual para OpenSSL (man 3 pem)), OpenSSL espera que la clave RSA esté en formato PKCS # 1. Claramente, esto no es con lo que ssh-keygen está trabajando. Tienes dos opciones (de buscar alrededor).

Si tiene OpenSSH v. 5.6 o posterior (no lo hice en mi computadora portátil), puede ejecutar esto:

ssh-keygen -f key.pub -e -m pem

El método más largo para hacer esto es separar su clave SSH en sus diversos componentes (la entrada del blog que encontré en esto acusa a OpenSSH de ser "propietaria", prefiero llamarla "única") y luego usar una biblioteca ASN1 para intercambiar cosas.

Afortunadamente para ti, alguien escribió el código para hacer esto:

https://gist.github.com/1024558

Brian Barba Roja
fuente
99
El ssh-keygenmétodo parece funcionar en Linux pero no en Mac OS X.
lid
3
Tapa, vea la nota en la respuesta sobre la versión SSH. OS X no incluye una versión reciente de OpenSSH. Ejecutar el comando ssh -V.
Brian Redbeard
3
No funciona en OpenSSH_6.2p2. Cómo funciona en OpenSSH_6.6p1.
Old Pro
-mno funciona para mí ... ¿cuál es el trabajo?
pstanton
2
¡Funciona para mí en Mac!
Greg Hornby
18

Suponiendo que tiene la clave privada SSH id_rsa, puede extraer la clave pública de esta manera:

openssl rsa -in id_rsa -pubout -out id_rsa.pub.pem

Me doy cuenta de que el OP preguntó sobre la conversión de una clave pública, por lo que esto no responde a la pregunta, sin embargo, pensé que sería útil para algunos de todos modos.

Tenga en cuenta también que este comando da como resultado un formato de clave pública PEM, que generalmente es lo que OpenSSL espera. La respuesta de Brian, por otro lado, da como resultado un archivo en formato RSAPublicKey, que no es el formato normal esperado por OpenSSL (aunque las versiones posteriores aparentemente pueden leerlo a través de la -RSAPublicKey_inbandera). Para convertir puedes hacer esto:

openssl rsa -RSAPublicKey_in -in id_rsa.rsapub.pem -pubout -out id_rsa.pub.pem
shawkinaw
fuente
Gracias, la publicación de la clave privada hizo el truco para mí.
Shaun Dewberry
openssl rsa -in id_rsa.pem -pubout -out id_rsa.pub.pemtambién funciona (es decir, la entrada es clave privada en formato pem). Buena respuesta.
Johnny Wong
1
Actualización: La respuesta de Brian se ha corregido a -m pkcs8la que, a pesar de la gente OpenSSH utilizando el nombre equivocado hace productos X.509 'pubkey'. Además, desde OpenSSH 6.5 en 2014-01 si el creador especificó 'nuevo formato' -opara una mejor seguridad, este método no funcionará, y dado que 7.8 en 2018-08 'nuevo formato' ahora es el predeterminado, lo mismo.
dave_thompson_085
11

El formato que desea es lo que ssh-keygenllama PKCS8. Entonces el siguiente comando producirá la salida deseada:

ssh-keygen -f key.pub -e -m pkcs8

Desde la ssh-keygenpágina del manual:

-m key_format
         Specify a key format for the -i (import) or -e (export) conversion 
         options.  The supported key formats are: 
         ``RFC4716'' (RFC 4716/SSH2 public or private key), 
         ``PKCS8'' (PEM PKCS8 public key) or 
         ``PEM'' (PEM public key).  
         The default conversion format is ``RFC4716''.
Aaron Meriwether
fuente
Este realmente funciona tanto en Linux como en macOS.
Jay Taylor
para extraer la clave pública generada equivalente de la clave privada en OpenSSL openssl rsa -in key -pubout -out key.pub.openssl.pkcs8
Mohannd
6

Similar al método de Amal Chaudhuri a continuación, esto es lo que funcionó para mí. Necesitaba crear un archivo pem a partir de la clave pública ssh que había generado para mi cliente SFTP (Cyberduck).

openssl rsa -in ~/.ssh/id_rsa -outform pem > id_rsa.pem
l3e0wu1f
fuente
Esto en realidad no parece funcionar.
outside2344
55
Esto SOLO funciona para la clave RSA privada NO la clave pública que OP estaba pidiendo. Entonces respuesta incorrecta.
Devy
3
En realidad, id_rsaya está en el formato correcto, puede verificarlo usted mismo, el resultado id_rsa.pemes 100% idéntico.
Miro Kropacek