Estoy usando el Ruby EC2 SDK, Versión 2. El material de la clave privada de una clave generada con EC2 se almacena en una cadena. Estoy tratando de generar el material de clave pública que es necesario para importar la clave en EC2 usando OpenSSL::PKey::RSA

Después de eso, intento import el par de llaves.

Se ve así:

kk=OpenSSL::PKey::RSA.new my_private_key_material
pub=kk.public_key
ec2.import_key_pair({key_name: "my_key", public_key_material: pub.export})

La API está arrojando este error:

*** Aws::EC2::Errors::InvalidKeyFormat Exception: Key is not in valid OpenSSH public key format

No estoy seguro de qué está mal y cómo generar el material de clave pública correctamente. Ya intenté codificar Base64 la cadena de clave pública sin éxito.

Editar

Probé un par de cosas nuevas. Generé una nueva clave usando la consola web EC2 desde cero y luego generé la pública de la forma en que Raphael señala a continuación con

openssl rsa -in mykey.pem -outform PEM -pubout -out mykey.pub

La clave no está encriptada.

Cuando intento importar la clave pública, ya sea con la consola web o por código, obtengo el mismo error.

Editar 2

Encontré esto.

Al generar la clave pública con un comando diferente, funciona:

ssh-keygen -y

La clave pública generada se ve diferente. Empieza con

ssh-rsa AAAAB3NzaC1yc2EAAAADA....

Mientras que el primero generado comienza con

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG....

Ahora la pregunta es cómo generar el primer formato en ruby. También encontré esta publicación en diferentes formatos.

1
Michael 5 may. 2017 a las 20:45

3 respuestas

La mejor respuesta

OK, lo resolví siguiendo esta publicación.

Resultó que la clave pública tenía que generarse de una manera diferente

kk=OpenSSL::PKey::RSA.new my_private_key_material
key=kk.public_key

type = key.ssh_type
data = [ key.to_blob ].pack('m0')

openssh_format = "#{type} #{data}"

ec2.import_key_pair({key_name: "my_key", public_key_material: openssh_format})
1
Community 23 may. 2017 a las 12:02

Rory tiene razón. En NodeJS, el siguiente código funcionó.

let keypair = fs.readFileSync(homedir + '/.ssh/id_rsa.pub');
result = await ec2.importKeyPair({
    KeyName: 'KeyPairName',
    PublicKeyMaterial: keypair,
}).promise();
0
Sanjay Vamja 3 abr. 2020 a las 14:38

La documentación sugiere que el contenido de la clave debe codificarse en el cliente Base64, sin embargo, este no es el caso: el contenido de la clave SSH debe proporcionarse tal cual, en el formato "ssh-rsa XXXXX ....".

1
Rory 23 abr. 2018 a las 11:07