c++ - 如何读取证书以使用 openssl 验证签名?
问题描述
我在 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 格式格式化)是 PEM_read_PUBKEY 读取的内容。您有 x509 证书,因此您想使用PEM_read_X509之类的东西来读取 x509 证书和然后使用X509_get_pubkey从 X509 证书中提取公钥。
推荐阅读
- php - 为什么 file_put_contents 将 2 行插入 json 文件?
- python - Docker 构建映像返回错误:lambci/lambda:术语“lambci/lambda”未被识别为 cmdlet、函数、脚本文件的名称
- python - 抓取列表问题
- wordpress - 是否可以将树枝变量传递到模板中?
- javascript - 部署时页面未呈现
- jupyter-notebook - 无法打开 Anaconda 命令提示符或任何笔记本
- php - 如何克服 npm run dev 错误(已编译 webpack)?
- terminal - 如何从 Mac 上的终端清除文件的所有内容
- javascript - 在转换为 typescript 的 create-react-app 项目中,浏览器控制台中丢失的源映射
- css - 如何在引导模式中使用全宽引导网格系统