OpenSSL 签名验证详解:PKCS7* p7、cafile 与 RSA 验签实现

OpenSSL 签名验证详解:PKCS7* p7、cafile 与 RSA 验签实现

摘要

本文深入剖析 OpenSSL 中 PKCS7* p7 数据结构和 cafile 的作用及相互关系,详细讲解基于 OpenSSL 的 RSA 验签字符串的 C 语言实现,涵盖签名解析、证书加载、验证流程及关键要点,助力开发者掌握数字签名验证技术,确保数据完整性和来源可靠性。

一、PKCS7* p7 与 cafile 的关键作用

(一)PKCS7* p7:签名数据的核心载体

  1. 结构与内容

    • PKCS#7(Public Key Cryptography Standards #7)标准涵盖数字签名、证书、数据加密及消息认证。PKCS7* p7 是处理 PKCS#7 格式数字签名的关键数据结构,通过 d2i_PKCS7_bio() 函数将 DER 编码的 PKCS#7 数据解析为该结构体。
    • p7 包含丰富的签名信息,如签名者信息、签名算法、签名数据及证书链等。在验证签名时,PKCS7_verify() 函数利用这些信息验证签名有效性、检查证书链完整性,确保数据未被篡改。
  2. 缺失影响

    PKCS7* p7 = d2i_PKCS7_bio(signp7_mem, 0);
    if (p7 == NULL) {
         
         
        // 无法获取签名信息,验证过程无法进行
    }
    
    • 若缺失 p7,将无法读取签名数据,整个验证过程直接失败,相当于没有验证对象。
  3. 释放内存

    • 使用完毕后,需调用 PKCS7_free(p7); 释放结构体,避免内存泄漏。

(二)cafile:信任链的根基

  1. 作用与使用

    • cafile 是包含根证书或中间证书的 CA(Certificate Authority,证书颁发机构)证书文件,用于建立信任链,验证签名者证书合法性,是数字签名验证的信任锚点。
    • 在代码中,通过 X509_STORE_load_locations(store, cafile, NULL) 将 CA 证书加载到证书库。PKCS7_verify() 函数利用加载的 CA 证书验证签名者证书,检查证书链完整性,确认签名者证书由可信 CA 签发。
  2. 缺失影响

    if (!X509_STORE_load_locations(store, cafile, NULL)) {
         
         
        LOG_ERR("Load CA file %s fail\n", cafile);
        // 无法建立信任链,验证过程无法完成
        return CRYPTO_FAIL;
    }
    
    • cafile 缺失或无效,无法验证签名者证书真实性,无法确认签名者身份,相当于有签名但无法确认其真实性,验证过程无法完成。
  3. 两者关系

    • 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)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值