Генерация пар ключей SSH (приватных / общедоступных) без ssh-keygen - PullRequest
20 голосов
/ 11 марта 2011

Я работаю над приложением Ruby / Rack, которое должно генерировать пары ключей SSH. Как бы я не хотел вызывать ssh-keygen из приложения, я не могу, потому что оно предназначено для работы на Heroku, и они не поддерживают вызов этой команды.

Мне удалось получить закрытые / открытые ключи RSA с помощью OpenSSL в стандартной библиотеке Ruby, выполнив следующие действия:

key = OpenSSL::PKey::RSA.generate(2048)
# => -----BEGIN RSA PRIVATE KEY----- ....
key.public_key
# => -----BEGIN RSA PUBLIC KEY----- ....

К сожалению, открытый ключ RSA и открытый ключ SSH - это не одно и то же, даже если они могут быть сгенерированы из одного и того же ключа RSA. Открытый ключ SSH выглядит примерно так:

ssh-rsa AAAAB3NzaC1yc2EAAAABIwA.....

Можно ли генерировать ключи SSH или преобразовывать ключи RSA в SSH в Ruby без использования ssh-keygen?

Ответы [ 3 ]

28 голосов
/ 30 апреля 2012

Возможно, это не тот случай, когда у вас возникла проблема, но исправления библиотеки net-ssh OpenSSL :: PKey :: RSA и :: DSA двумя способами:

#ssh_type - возвращает "ssh-rsa" или "ssh-dss" в зависимости от ситуации

и #to_blob - возвращает открытый ключ в формате двоичного двоичного объекта OpenSSH. Если вы закодируете его с помощью base64, это формат, который вы ищете.

require 'net/ssh'

key = OpenSSL::PKey::RSA.new 2048

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

openssh_format = "#{type} #{data}"
15 голосов
/ 13 марта 2011

Оказывается, это было намного сложнее, чем я ожидал.Я закончил тем, что написал SSHKey gem , чтобы выполнить его (исходный код на GitHub ).Открытые ключи SSH закодированы совершенно иначе, чем предоставленный открытый ключ RSA.Кодировка типа данных для ключей SSH определена в разделе № 5 RFC # 4251 .

0 голосов
/ 11 марта 2011
key.public_key.to_pem

Полный процесс, включая шифрование ключей, описан здесь: http://stuff -things.net / 2009/12/11 / generation-rsa-пары-пары-в-рубине /

...