c++ - 如何读取证书以使用 openssl 验证签名?

标签 c++ linux ssl openssl

我在 linux 上用 openssl 生成了私钥和相应的证书,使用这些命令:

openssl req -x509 -newkey rsa:1024 -keyout key.pem -out certificate.pem -days 730 -nodes

这为我生成了两个文件:key.pemcertificate.pem

使用 key.pem,通过 C++(PEM_read_PrivateKeyRSA_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/

相关文章:

具有纯虚函数的 C++ 继承

c++ - 如何创建 C/C++ 库并将其放入 iOS 版 Xcode 中?

c++ - C++ 中的模板问题

linux - ARM926 USB 电源管理

linux - 无法删除目录

ssl - boringssl 可以在裸机 ARM 系统中工作吗?

c++ - 在这种情况下我应该使用脚本吗?

linux - 将字符串传递给脚本

asp.net - Firefox 和 IE 上的网站 SSL 内容问题

html - 分析页面,看看哪些资源没有在https中传输