为啥我无法使用 PEM_read_RSAPublicKey 读取 openssl 生成的 RSA pub 密钥?
Posted
技术标签:
【中文标题】为啥我无法使用 PEM_read_RSAPublicKey 读取 openssl 生成的 RSA pub 密钥?【英文标题】:Why I can't read openssl generated RSA pub key with PEM_read_RSAPublicKey?为什么我无法使用 PEM_read_RSAPublicKey 读取 openssl 生成的 RSA pub 密钥? 【发布时间】:2011-12-10 17:06:45 【问题描述】:我正在尝试读取使用 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 发布密钥。
谢谢
【问题讨论】:
【参考方案1】:您可以尝试PEM_read_RSA_PUBKEY()
而不是PEM_read_RSAPublicKey()
。
这都是关于格式的。
openssl 生成的默认公钥文件格式为 PEM 格式。
PEM_read_RSA_PUBKEY()
读取 PEM 格式。 PEM_read_RSAPublicKey()
读取 PKCS#1 格式。
因此,如果您想坚持使用PEM_read_RSAPublicKey()
,您可以通过在生成公钥时指定-outform DER
选项来使用PKCS#1 格式生成公钥文件。
【讨论】:
希望我能写出一个远没有 OpenSSL 文档中提到的解释那么神秘的解释。 我使用-outform DER
生成了公钥,但仍然出现分段错误。
我想从内存而不是文件中读取公钥。我用过PEM_read_bio_RSA_PUBKEY
,但没用。
@mustafa.yavuz:由于这些问题似乎与这个特定问题无关,请将您的问题作为一个新问题提出。
此答案不正确且具有误导性。 PEM_read_RSA_PUBKEY
和 PEM_read_RSAPublicKey
都读取 PEM 格式,但前者需要一个 SubjectPublicKeyInfo 结构,而后者需要一个 RSAPublicKey 结构。前者由openssl命令行工具生成,以BEGIN PUBLIC KEY开头,后者以BEGIN RSA PUBLIC KEY开头。【参考方案2】:
看来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 -RSAPublicKey_out -out key.pub2_
B转A格式
$ openssl rsa -in key.pub2 -RSAPublicKey_in -pubout -out key.pub1_
【讨论】:
【参考方案3】: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
【讨论】:
以上是关于为啥我无法使用 PEM_read_RSAPublicKey 读取 openssl 生成的 RSA pub 密钥?的主要内容,如果未能解决你的问题,请参考以下文章