Недопустимые открытые ключи при использовании библиотеки Ruby OpenSSL - PullRequest
3 голосов
/ 08 января 2011

Я пытаюсь сгенерировать пары ключей RSA в Ruby, в основном используя примеры из этого сообщения в блоге . Вот мой слегка измененный код:

def generate_keypair(passphrase)
   rsa_key = OpenSSL::PKey::RSA.new(2048)
   cipher =  OpenSSL::Cipher::Cipher.new('aes-256-cbc')
   private_key = rsa_key.to_pem(cipher, passphrase)
   public_key = rsa_key.public_key.to_pem
   return private_key, public_key
end

Это успешно генерирует закрытый ключ и открытый ключ, и я могу записать их в файлы в файловой системе.

irb(main):002:0> private_key1, public_key1 = generate_keypair('test')
[...output of keys...]
irb(main):003:0> File.open("key.pem","w") {|f| f.write(private_key1) }
=> 1766
irb(main):004:0> File.open("pubkey.pem","w") {|f| f.write(public_key1) }
=> 426

Однако OpenSSL жалуется, когда я пытаюсь использовать этот открытый ключ:

$ openssl rsautl -encrypt -inkey pubkey.pem -pubin -in text.txt -out text.ssl
unable to load Public Key

Если я использую инструмент openssl для извлечения открытого ключа из закрытого ключа, то все работает:

$ openssl rsa -in key.pem -pubout -out pubkey2.pem
Enter pass phrase for key.pem:
writing RSA key
$ openssl rsautl -encrypt -inkey pubkey2.pem -pubin -in text.txt -out text.ssl
$ openssl rsautl -decrypt -inkey key.pem -in text.ssl 
Enter pass phrase for key.pem:
this is a 
file that
needs to be
encrypted

Открытый ключ, созданный библиотекой Ruby OpenSSL, отличается от открытого ключа, который инструмент openssl cli извлек из личного ключа:

$ cat pubkey.pem 
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAzgNcsEL7yGBoLBYBXFYrDL6oLP8ZbW9+VwdoXyNG6Qt/NEhEx4Ww
5yOxtXAbqeUwyvbTUxRrJ02dQcb4FGcSMDgz2QHIZyCuDJkgC9Wj7KI1Q7g0GV+7
DcZvLcwPZOhLXqUzlcZXjDWM1PZ+az734qEribgyI+87LB8TujG8v5iOvdzT/Je4
JAllToZVGC3RddfTc6ww37gB39B++FYNzPg+nrIEU45KgEWPo2eJxBpX29lACh6q
EEBCQr9xyLxOC2eomYIl3dG2dV7nGGH7Pur2HjppgJphBvNkwxIWUa/pD6hAnOQ4
MkDDFGwWv7eJLb4UZuZjafTbqokHved3bwIDAQAB
-----END RSA PUBLIC KEY-----

$ cat pubkey2.pem 
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzgNcsEL7yGBoLBYBXFYr
DL6oLP8ZbW9+VwdoXyNG6Qt/NEhEx4Ww5yOxtXAbqeUwyvbTUxRrJ02dQcb4FGcS
MDgz2QHIZyCuDJkgC9Wj7KI1Q7g0GV+7DcZvLcwPZOhLXqUzlcZXjDWM1PZ+az73
4qEribgyI+87LB8TujG8v5iOvdzT/Je4JAllToZVGC3RddfTc6ww37gB39B++FYN
zPg+nrIEU45KgEWPo2eJxBpX29lACh6qEEBCQr9xyLxOC2eomYIl3dG2dV7nGGH7
Pur2HjppgJphBvNkwxIWUa/pD6hAnOQ4MkDDFGwWv7eJLb4UZuZjafTbqokHved3
bwIDAQAB
-----END PUBLIC KEY-----

Я не совсем уверен, что здесь происходит, но похоже, что библиотека Ruby OpenSSL создает недопустимый файл pem с открытым ключом. Я что-то не так делаю?

1 Ответ

3 голосов
/ 08 января 2011

Похоже, что OSSL не поддерживает этот формат. То, что генерирует «openssl rsa», представляет собой структуру RSA_PUBKEY: запись PUBKEY, которая помечена как ASN.1 (с OID), чтобы указать, что это ключ RSA. Ruby генерирует «необработанный» ключ RSA (где байты не указывают, что это RSA; поэтому вы должны объявить это в заголовке PEM).

OSSL должен использовать функцию API, такую ​​как PEM_write_bio_RSA_PUBKEY (или универсальный PEM_write_bio_PUBKEY), вместо / в дополнение к PEM_write_bio_RSAPublicKey.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...