我目前正在用C ++编写一个存储X509证书的系统。然后,系统可以通过为其提供电子邮件地址来查询,然后它将从与该电子邮件地址关联的X509证书中返回公钥。
我的问题是系统正在返回我的加密系统读取的公钥无效(我使用jsencrypt)。
我的测试证书是使用以下命令生成的(首先生成密钥然后生成证书):
openssl genrsa -out key.pem 2048
openssl req -x509 -key key.pem -new -x509 -out cert.pem -days 365
然后,C ++后端读入PEM文件以获取X509对象。要获取系统上的公钥:我使用以下代码:
RSA* Certificate::getPublicKey()
{
EVP_PKEY* pkey = X509_get_pubkey(cert);
RSA* rsa = EVP_PKEY_get1_RSA(pkey);
EVP_PKEY_free(pkey);
return rsa;
}
系统将返回如下所示的公钥:
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEApMyUxuYFmaWa76iiHbEKsH58k1qwtfg19ank8E57W8WCBva/qW9K
5HRR5oGetDimlf9ni9yZZV5dQFSQmEF0tBuk1QvAMJNPrLFAfvI0GqpHD/8xUgLG
DLVEjSx15eTV9Y31x4iv8iHYYo5BJ4QnlPt2Xj5hvEx2K4VD1uWNJT38gGgoik37
Atz4sEDJ0VNXnJTMKr2PlVEvW7OoRqT8/LlsWygUqqBDOFcJpCVehCxwdbDTgOfn
lVWFUSXWphjmERST06b20M2HjFOLOH7GeMuvApYzuRahZjuKqEdK1c10XC/VRJ4M
g4MePO7JqfTlEfX/VeNgp5aD7OVGQsl2swIDAQAB
-----END RSA PUBLIC KEY-----
但是,我在我的前端jsencrypt中使用的加密库并不认为这是有效的。当我检查我生成的测试证书以及jsencrypt的文档和示例时,我注意到系统使用X509_get_pubkey()返回的密钥并不正确
例如,当我在密钥和证书PEM文件上运行以下命令以检索公钥时......:
openssl rsa -pubout -in key.pem -out keyPub.pem
openssl x509 -inform pem -in cert.pem -pubkey -noout > keyPub.pem
在这两种情况下,keyPub.pem的内容都是:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApMyUxuYFmaWa76iiHbEK
sH58k1qwtfg19ank8E57W8WCBva/qW9K5HRR5oGetDimlf9ni9yZZV5dQFSQmEF0
tBuk1QvAMJNPrLFAfvI0GqpHD/8xUgLGDLVEjSx15eTV9Y31x4iv8iHYYo5BJ4Qn
lPt2Xj5hvEx2K4VD1uWNJT38gGgoik37Atz4sEDJ0VNXnJTMKr2PlVEvW7OoRqT8
/LlsWygUqqBDOFcJpCVehCxwdbDTgOfnlVWFUSXWphjmERST06b20M2HjFOLOH7G
eMuvApYzuRahZjuKqEdK1c10XC/VRJ4Mg4MePO7JqfTlEfX/VeNgp5aD7OVGQsl2
swIDAQAB
-----END PUBLIC KEY-----
这被认为是有效的,并且可以由前端的加密库成功使用。
查看两个输出,C ++ OpenSSL API调用返回稍微短的PEM输出,它缺少前32个字符。除此之外,两个输出是相同的。
我的问题是:这里发生了什么?为什么X509_get_pubkey()返回截断的输出?如何以编程方式检索正确的公钥?