c++ - 如何使用根公钥以编程方式验证中间证书签名?
问题描述
背景
我有以下链:
- 根证书,自签名
- 中级证书,由 Root 颁发
- 中间人签发的用户证书
我正在尝试使用颁发者(根)的公钥来验证中间证书的签名。我正在使用以下代码片段来实现此任务:
int verify_cert_sig(X509 *issuer, X509 *cert){
EVP_PKEY *public_key = X509_get_pubkey(issuer);
if(public_key == NULL){
_log->error("unable to get public key");
return ERROR;
}
int result = X509_verify(cert, public_key);
EVP_PKEY_free(public_key);
if(result <= 0){
return ERROR;
}
return SUCCESS;
}
int verify_sig(const std::string &issuer, const std::string &cert){
X509 *issuer_x509 = load_cert("root.pem", X509_FILETYPE_PEM);
if(issuer_x509 == NULL){
_log->error("unable to load x509 cert: {}", issuer);
return ERROR;
}
X509 *cert_x509 = load_cert("intermediate.pem", X509_FILETYPE_PEM);
if(cert_x509 == NULL){
_log->error("unable to load x509 cert: {}", cert);
return ERROR;
}
auto rv = verify_cert_sig(issuer_x509, cert_x509);
X509_free(issuer_x509);
X509_free(cert_x509);
if(rv <= 0){
return ERROR;
}
return SUCCESS;
}
问题
由于我不知道的原因,前面的代码段将返回错误。
但是,如果我使用 openssl cli,我可以使用 root 验证中间:
$:openssl verify -verbose -CAfile root.pem intermediate.pem
subroot.pem: OK
问题
- 我究竟做错了什么?我错过了什么?
- 如何使用颁发者的公钥验证中间证书的签名?
解决方案
推荐阅读
- android-studio - (Vscode) 自动将调试器附加到 android 进程以运行 Android Studio 应用程序
- amazon-web-services - 无法使用创建 Greengrass Core 设备
- django - jwt.decode() 得到了一个意外的关键字参数“验证”
- python - 如何匹配两个不同的数据框以显示哪些行匹配以及哪些行存在差异(显示差异)
- python - 从 TFX/setuptools 禁用无用的日志/输出
- javascript - 使用 Prettier VS Code 删除 Vue 文件中的括号包装
- r - 如何在 flexdashboard 中放置对象
- c# - VS 代码 - 未找到“.NETFramework,Version=v5.0”的参考程序集
- reactjs - 为什么在 NextJS 的 getInitialProps 中使用使用 axios.post 请求
- c# - 将鼠标悬停在 url RichTextBox 上时更改光标