我正在尝试读取使用openssl生成的RSA公钥,如下所示:
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会生成RSA公钥的X509密钥。但我甚至无法加载X509发布密钥。
由于
答案 0 :(得分:27)
您可以尝试使用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 :(得分:1)
似乎rsa公钥有两种格式,具有不同的编码。
obtainLock("GET_OR_CREATE_FOOBAR")
// now we hold the lock and are synchronized
get()
if (doesNotExistYet) create()
commit / release-lock
以这种格式阅读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
以这种格式阅读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
答案 2 :(得分:0)
openssl rsa实用程序使用保存公钥 函数PEM_write_bio_RSA_PUBKEY而不是PEM_write_bio_RSAPubicKey。所以, 如果您希望您的程序与其输出兼容,那么您 应该使用PEM_write_bio_RSA_PUBKEY和PEM_read_bio_RSA_PUBKEY 保存/加载公钥文件。