You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pico设备WolfSSL TLS客户端证书验证失败及DER解析需求

WolfSSL 轻量DER证书字段解析方案(适配Pico精简构建)

针对你在Pico上搭建WolfSSL TLS客户端的需求,无需启用OPENSSL_EXTRA_X509_SMALL宏,WolfSSL原生提供了一组轻量函数,可直接从DER格式证书缓冲区解析所需字段,同时保持构建体积最小化:

核心解析函数清单

以下函数均属于WolfSSL原生X509模块,默认编译(开启WOLFSSL_X509,极致精简时需确认该宏未被禁用)即可使用,无额外体积负担:

  • 解析证书序列号:wolfSSL_X509_GetSerialNumber
    直接从DER缓冲区提取序列号字节流,参数包含DER数据指针、长度,以及输出用的序列号缓冲区和长度变量。
  • 生成证书指纹:wolfSSL_X509_Fingerprint
    支持SHA1/SHA256等哈希算法,直接处理DER证书生成指纹哈希值,适合快速对比验证。
  • 提取签发者/主体名称:wolfSSL_X509_GetIssuerName / wolfSSL_X509_GetSubjectName
    可获取名称字段的原始ASN.1 DER数据,若仅需匹配验证,直接对比字节流即可,无需解码为可读字符串,减少性能开销。
  • 解析签名信息:wolfSSL_X509_GetSignature / wolfSSL_X509_GetSignatureType
    前者提取签名算法OID和签名值的DER数据,后者直接返回签名算法类型标识。

验证回调中使用示例

int custom_verify_callback(int preverify_ok, WOLFSSL_X509_STORE_CTX* ctx) {
    // 从ctx中获取当前待验证的DER证书及长度
    const unsigned char* der_cert = ctx->certs[ctx->cert_depth];
    int der_len = ctx->cert_lens[ctx->cert_depth];

    // 1. 验证证书序列号
    unsigned char serial_buf[32];
    unsigned int serial_len = sizeof(serial_buf);
    if (wolfSSL_X509_GetSerialNumber(der_cert, der_len, serial_buf, &serial_len) != SSL_SUCCESS) {
        return SSL_FAILURE;
    }
    // 对比预存的目标序列号
    const unsigned char target_serial[] = {0x02, 0x03, 0x47, 0x9E, 0xDC, 0x9E, 0x20, 0x74};
    if (memcmp(serial_buf, target_serial, serial_len) != 0) {
        return SSL_FAILURE;
    }

    // 2. 验证SHA256指纹
    unsigned char fp_buf[32];
    unsigned int fp_len = sizeof(fp_buf);
    if (wolfSSL_X509_Fingerprint(der_cert, der_len, fp_buf, &fp_len, WOLFSSL_SHA256) != SSL_SUCCESS) {
        return SSL_FAILURE;
    }
    // 对比预存的目标指纹
    const unsigned char target_fp[] = {0x93, 0x3C, 0x6D, 0xDE, 0x6A, 0xFD, 0x0A, 0xAF, 0x7E, 0x8B, 0x23, 0xBB, 0x8E, 0x5F, 0x73, 0x5B, 0xDA, 0x68, 0x34, 0x3C, 0x51, 0x64, 0x8A, 0x1A, 0x36, 0x9C, 0xED, 0x6D, 0xBD, 0x8E, 0x39, 0x05};
    if (memcmp(fp_buf, target_fp, fp_len) != 0) {
        return SSL_FAILURE;
    }

    // 3. 可选:验证签发者名称(直接对比DER字节流)
    unsigned char issuer_buf[128];
    unsigned int issuer_len = sizeof(issuer_buf);
    if (wolfSSL_X509_GetIssuerName(der_cert, der_len, issuer_buf, &issuer_len) != SSL_SUCCESS) {
        return SSL_FAILURE;
    }
    const unsigned char target_issuer[] = {0x30, 0x81, 0x9F, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x30, 0x81, 0x8D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x0A, 0x41, 0x6D, 0x61, 0x7A, 0x6F, 0x6E, 0x20, 0x43, 0x41, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x0A, 0x41, 0x6D, 0x61, 0x7A, 0x6F, 0x6E, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x31, 0x2E, 0x30, 0x2C, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x25, 0x41, 0x6D, 0x61, 0x7A, 0x6F, 0x6E, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x20, 0x31, 0x20, 0x28, 0x75, 0x73, 0x29, 0x20, 0x2D, 0x20, 0x32, 0x30, 0x32, 0x34, 0x30, 0x31, 0x30, 0x31};
    if (memcmp(issuer_buf, target_issuer, issuer_len) != 0) {
        return SSL_FAILURE;
    }

    return preverify_ok;
}

精简构建额外建议

  • 编译时关闭未使用的加密算法,例如仅保留SHA256、RSA(或ECDSA,更小体积);
  • 禁用WOLFSSL_TLS13、WOLFSSL_DTLS等未用到的协议模块;
  • 使用--enable-smallstack、--enable-minimal等编译选项进一步压缩体积。

内容的提问来源于stack exchange,提问作者gusto2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 03:43:27