OpenSSL 签名验证详解:PKCS7* p7、cafile 与 RSA 验签实现
摘要
本文深入剖析 OpenSSL 中 PKCS7* p7 数据结构和 cafile 的作用及相互关系,详细讲解基于 OpenSSL 的 RSA 验签字符串的 C 语言实现,涵盖签名解析、证书加载、验证流程及关键要点,助力开发者掌握数字签名验证技术,确保数据完整性和来源可靠性。
一、PKCS7* p7 与 cafile 的关键作用
(一)PKCS7* p7:签名数据的核心载体
-
结构与内容
- PKCS#7(Public Key Cryptography Standards #7)标准涵盖数字签名、证书、数据加密及消息认证。
PKCS7* p7是处理 PKCS#7 格式数字签名的关键数据结构,通过d2i_PKCS7_bio()函数将 DER 编码的 PKCS#7 数据解析为该结构体。 p7包含丰富的签名信息,如签名者信息、签名算法、签名数据及证书链等。在验证签名时,PKCS7_verify()函数利用这些信息验证签名有效性、检查证书链完整性,确保数据未被篡改。
- PKCS#7(Public Key Cryptography Standards #7)标准涵盖数字签名、证书、数据加密及消息认证。
-
缺失影响
PKCS7* p7 = d2i_PKCS7_bio(signp7_mem, 0); if (p7 == NULL) { // 无法获取签名信息,验证过程无法进行 }- 若缺失
p7,将无法读取签名数据,整个验证过程直接失败,相当于没有验证对象。
- 若缺失
-
释放内存
- 使用完毕后,需调用
PKCS7_free(p7);释放结构体,避免内存泄漏。
- 使用完毕后,需调用
(二)cafile:信任链的根基
-
作用与使用
cafile是包含根证书或中间证书的 CA(Certificate Authority,证书颁发机构)证书文件,用于建立信任链,验证签名者证书合法性,是数字签名验证的信任锚点。- 在代码中,通过
X509_STORE_load_locations(store, cafile, NULL)将 CA 证书加载到证书库。PKCS7_verify()函数利用加载的 CA 证书验证签名者证书,检查证书链完整性,确认签名者证书由可信 CA 签发。
-
缺失影响
if (!X509_STORE_load_locations(store, cafile, NULL)) { LOG_ERR("Load CA file %s fail\n", cafile); // 无法建立信任链,验证过程无法完成 return CRYPTO_FAIL; }- 若
cafile缺失或无效,无法验证签名者证书真实性,无法确认签名者身份,相当于有签名但无法确认其真实性,验证过程无法完成。
- 若
-
两者关系
p7是验证对象(要验证什么),cafile是验证依据(如何验证),二者缺一不可,只有结合才能完成完整的签名验证过程。
二、OpenSSL RSA 验签字符串的 C 语言实现
(一)完整代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/evp.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#include <openssl/bio.h>
#include <openssl/buffer.h>
// 错误处理函数
void handle_openssl_error() {
ERR_print_errors_fp(stderr);
exit(EXIT_FAILURE);
}
// Base64解码函数
int base64_decode(const char *base64_data, unsigned char **decoded_data, size_t *decoded_len) {
BIO *bio, *b64;
int len = strlen(base64_data)

最低0.47元/天 解锁文章
1586

被折叠的 条评论
为什么被折叠?



