Почему я не могу прочитать сгенерированный 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.
Спасибо
Ответы
Ответ 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