Подтвердить что ты не робот

Почему я не могу прочитать сгенерированный openssl ключ RSA pub с PEM_read_RSAPublicKey?

Я пытаюсь прочитать открытый ключ 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.

Спасибо

4b9b3361

Ответ 1

Вы можете попробовать 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 при создании открытого ключа.

Ответ 2

Утилита 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

Ответ 3

кажется, есть два формата открытого ключа 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