Генерация пар ключей SSH (закрытая / общедоступная) без ssh-keygen

Я работаю над приложением 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?


person bensie    schedule 11.03.2011    source источник


Ответы (3)


Возможно, это было не так, когда у вас была проблема, но исправления библиотеки 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}"
person benizi    schedule 29.04.2012
comment
Это действительно красивое и емкое решение. - person sethvargo; 10.01.2014
comment
обратите внимание, net / ssh - довольно большая жемчужина, такая же, как исправление обезьян и так далее. Ответ @bensie - гораздо более легкий подход - person Sam Saffron; 09.03.2018

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

person bensie    schedule 13.03.2011

key.public_key.to_pem

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

person Douglas F Shearer    schedule 11.03.2011
comment
OpenSSL :: PKey :: RSA # to_pem, похоже, просто предоставляет строковый вывод, он не преобразует его в формат открытого ключа SSH. - person bensie; 11.03.2011
comment
Я также попытался просто добавить ssh-rsa и добавить синтаксис комментария к строке, но это не то же самое и не распознается как действительный открытый ключ. - person bensie; 11.03.2011