ruby 从现有格式导入ec2密钥时OpenSSH密钥格式无效

ih99xse1  于 2023-01-16  发布在  Ruby
关注(0)|答案(4)|浏览(144)

我使用的是ruby EC2 SDK,Version 2。使用EC2生成的密钥的私钥材料存储在字符串中。我尝试使用OpenSSL::PKey::RSA生成将密钥导入EC2所需的公钥材料
之后,我将尝试导入密钥对。
它看起来像这样:

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})

API抛出此错误:

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

我不知道哪里出错了,也不知道如何正确地生成公钥材料。我已经尝试过对公钥字符串进行Base64编码,但没有成功。

    • 编辑**

我尝试了一些新的东西。我使用EC2 Web控制台从头开始生成了一个新的密钥,然后按照Raphael在下面指出的方式生成了一个公共密钥

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

密钥未加密。
无论是用Web控制台还是用代码导入公钥,我都得到了同样的错误。

    • 编辑2**

我发现了这个。
当使用不同的命令生成公钥时,它的工作原理是:

ssh-keygen -y

生成的公钥看起来不同。它以

ssh-rsa AAAAB3NzaC1yc2EAAAADA....

而第一个生成的开始于

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

现在的问题是如何用ruby生成第一个格式,我还发现了this发布的不同格式。

y3bcpkx1

y3bcpkx11#

好的,我按照this post解决了这个问题。
结果证明公钥必须以不同的方式生成

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})
idv4meu8

idv4meu82#

文档建议密钥内容必须在Base64客户端编码,但实际情况并非如此:SSH密钥内容应按原样提供,格式为“ssh-rsa XXXXX...."。

41ik7eoe

41ik7eoe3#

Rory是对的。在NodeJS下面的代码工作。

let keypair = fs.readFileSync(homedir + '/.ssh/id_rsa.pub');
result = await ec2.importKeyPair({
    KeyName: 'KeyPairName',
    PublicKeyMaterial: keypair,
}).promise();
gpnt7bae

gpnt7bae4#

我正在使用Ruby SDK V3,这是我将密钥导入AWS的工作

#!/usr/bin/env ruby
require 'rubygems'
require 'aws-sdk-ec2'

key_content = File.read('/home/xxx/keys/sshkey.pub')
ec2_client =  Aws::EC2::Client.new()
resp = ec2_client.import_key_pair({
  dry_run: false,
  key_name: "test-ruby-key",
  public_key_material: key_content,
})

希望对你有帮助!

相关问题