我在 linux 上用 openssl 生成了私钥和相应的证书,使用这些命令:
openssl req -x509 -newkey rsa:1024 -keyout key.pem -out certificate.pem -days 730 -nodes
这为我生成了两个文件:key.pem 和 certificate.pem
使用 key.pem,通过 C++(PEM_read_PrivateKey,RSA_sign)我已经签署了一些数据。
现在使用证书我想验证签名。
但是,在读取证书时,我遇到了一个错误,即函数 PEM_read_PUBKEY 返回了 NULL:
FILE * certificate_fd = NULL;
std::string cert_file = "certificate.pem";
certificate_fd = fopen(cert_file.toLatin1().data(), "rt");
if (NULL == certificate_fd) return;
EVP_PKEY * certificate = NULL;
certificate = PEM_read_PUBKEY(certificate_fd, NULL, NULL, NULL);
我对 PEM_read_PUBKEY 做错了什么?
certificate.pem的内容是这样的:
-----BEGIN CERTIFICATE-----
MIICSDCCAbmgAwIBAgIJANsiiJZfGhv6MAUGAQAFADBFMQswCQYDVQQGEwJBVTET
MBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQ
dHkgTHRkMB4XDTE5MDQyMjA4MDYzN1oXDTIxMDQyMTA4MDYzN1owRTELMAkGA1UE
BhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdp
ZGdpdHMgUHR5IEx0ZDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAyRvzRUsq
3emLnazT/4ltvq9fA3sIK8hJrQ0Toom1aNNzJEowGwgMdXrooaxwj8Ggx7vaGOiU
aLwsAgaHWSWgu+9hGT14wm1IKxqKuq1fRtEzLnfm6TrQFX2nw5PcNaHd9oLn/Lae
QClGWqyCPCGT1oqYdLAdNdAZnwfCQ/9Fh+UCAwEAAaNQME4wHQYDVR0OBBYEFCBk
ua4N8cd3ab48CqiHe2dHe4kSMB8GA1UdIwQYMBaAFCBkua4N8cd3ab48CqiHe2dH
e4kSMAwGA1UdEwQFMAMBAf8wBQYBAAUAA4GBAKX6x75Bqk5oQ5lPRtliyeJIBWJJ
ungemucA6AbfDezvelPLbe712JDWYMULL3Yp6lz4pHEVvmlpHUecc6cM0WZk2gdY
+dwYtf/DRNNxkjth41CxZMB5zg0+bIFuOrJ8dzWGRIZ1m3zuQG+y5BOm3ktoqnaQ
2PIvUl4tEUsJaStq
-----END CERTIFICATE-----
编辑:
我已经看到问题出在 --------BEGIN CERTIFICATE------/------END CERTIFICATE----- ----.
但是是openssl生成的。那有什么问题呢?
最佳答案
您对 RSA 公钥和 x509 证书感到困惑。 x509 证书可以包含一个 RSA 公钥,但是 PEM_read_PUBKEY 读入的是“公钥”本身(以 PEM 格式格式化)。你有一个 x509 证书,所以你想使用类似 PEM_read_X509 的东西。读入 x509 证书,然后使用 X509_get_pubkey从 X509 证书中提取公钥。
关于c++ - 如何读取证书以使用 openssl 验证签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55830825/