Создать SSH Keypairs (частный/общедоступный) без 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
?
Ответы
Ответ 1
Оказывается, это было намного сложнее, чем я ожидал. Я закончил тем, что написал камень SSHKey, чтобы отключить его (исходный код на GitHub). Открытые ключи SSH кодируются полностью иначе, чем предоставленный открытый ключ RSA. Кодирование типа данных для SSH-ключей определено в разделе № 5 RFС# 4251.
Ответ 2
Возможно, это было не так, как если бы у вас возникла проблема, но net-ssh библиотеки OpenSSL:: PKey:: RSA и :: DSA с двумя способами:
#ssh_type
- возвращает "ssh-rsa"
или "ssh-dss"
в зависимости от ситуации
и #to_blob
- возвращает открытый ключ в формате binary-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}"
Ответ 3
key.public_key.to_pem
Полный процесс, включая шифрование ключей, описан здесь: http://stuff-things.net/2009/12/11/generating-rsa-key-pairs-in-ruby/