Почему я не могу прочитать сгенерированный openssl ключ публикации RSA с помощью PEM_read_RSAPublicKey? - PullRequest
16 голосов
/ 19 октября 2011

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

Private Key:
    openssl genrsa -out mykey.pem 1024

Public Key afterwards:
    openssl rsa -in mykey.pem -pubout > somewhere.pub

Тогда я пытаюсь прочитать:

FILE *keyfile = fopen("somewhere.pub", "r");
RSA *rsa_pub = PEM_read_RSAPublicKey(keyfile, NULL, NULL, NULL);
//rsa_pub == NULL!

Когда я читаю закрытый ключ, он работает

FILE *keyfile = fopen("mykey.pem", "r");
RSA *rsa_pri = PEM_read_RSAPrivateKey(keyfile, NULL, NULL, NULL);
//all good

Есть идеи?

Я читал, что openssl генерирует ключ X509 открытого ключа RSA. Но мне не удалось загрузить даже ключ публикации X509.

Спасибо

Ответы [ 3 ]

27 голосов
/ 19 октября 2011

Вы можете попробовать PEM_read_RSA_PUBKEY() вместо PEM_read_RSAPublicKey().

Это все о форматах.

Формат файла открытого ключа по умолчанию, сгенерированный openssl, - это формат PEM.

PEM_read_RSA_PUBKEY() читает формат PEM.PEM_read_RSAPublicKey() читает формат PKCS # 1.

Поэтому, если вы хотите придерживаться PEM_read_RSAPublicKey(), вы можете сгенерировать файл открытого ключа, используя формат PKCS # 1, указав опцию -outform DER при генерации открытогоключ.

1 голос
/ 25 января 2019

кажется, что есть два формата открытого ключа RSA, с разной кодировкой.

A. RSA_PUBKEY

RSA* rsaPubKey = PEM_read_bio_RSA_PUBKEY( bio, NULL, 0, pass ) ;

читать PUBKEY с этим форматом

-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----

генерируется

openssl rsa -in key.pri -pubout -out key.pub1

B. RSAPublicKey

RSA* rsaPubKey = PEM_read_bio_RSAPublicKey( bio, NULL, 0, pass ) ;

читать PublicKey с этим форматом

-----BEGIN RSA PUBLIC KEY-----
...
-----END RSA PUBLIC KEY-----

генерируется

openssl rsa -in key.pri -RSAPublicKey_out -out key.pub2

конвертировать A в B формат

openssl rsa -in key.pub1 -pubin -pubout -out key.pub2
0 голосов
/ 08 сентября 2017

Утилита openssl rsa сохраняет открытый ключ, используя функцию PEM_write_bio_RSA_PUBKEY, а не PEM_write_bio_RSAPubicKey.Итак, если вы хотите, чтобы ваша программа была совместима с ее выводом, то вы должны использовать PEM_write_bio_RSA_PUBKEY и PEM_read_bio_RSA_PUBKEY для сохранения / загрузки файлов открытого ключа.

http://openssl.6102.n7.nabble.com/RSA-public-private-keys-only-work-when-created-programatically-td12532.html

...