• Mbedtls PEM 证书解析失败,错误码-9570: ASN1 tag was of an unexpected value


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 m0_53983533 2024-04-19 13:45 采纳率: 0% 浏览 1 首页/ 编程语言 / Mbedtls PEM 证书解析失败,错误码-9570: ASN1 tag was of an unexpected value c语言 Mbedtls PEM 证书解析失败,错误码-9570: ASN1 tag was of an unexpected value ​​PEM 格式的证书在做解析的时候,先使用pem_read 然后再做parse,这个证书使用openssl指令解析没有任何问题,这段代码再解析别的这个类型证书的时候能够正常运行,请问下还有什么需要注意的呢。 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    2条回答 默认 最新

    • Kwan的解忧杂货铺 Java领域优质创作者 2024-04-19 13:45
      关注

      下午好🌅🌅🌅
      本答案参考ChatGPT-3.5

      根据你提供的代码和错误提示,可能导致Mbedtls PEM证书解析失败的原因有以下几点:

      1. PEM格式的证书内容是否完整:确保证书的起始标签-----BEGIN CERTIFICATE-----和结束标签-----END CERTIFICATE-----没有被修改、删除或添加其他字符,确保证书内容没有被截断。

      2. PEM证书是否包含其他非必要的内容:确保证书中只包含必要的PEM格式证书,而不包含其他内容,如私钥、公钥或其他非X.509证书内容。

      3. PEM解析函数的参数是否正确设置:确保mbedtls_pem_read_buffer函数的参数headerfooter与给定的PEM证书起始标签和结束标签匹配,确保cert_buffer_len_used在使用之前被初始化为0。

      除了以上几点,还有一些其他的建议可以考虑:

      1. 使用mbedtls_pem_read_buffer()函数的返回值进行错误检查:确保函数调用后返回的错误码没有出错,若出错请使用mbedtls_strerror()函数获取错误描述。

      2. 确保正确初始化mbedtls_x509_crt结构体:在调用mbedtls_x509_crt_parse()函数之前,确保已经对x509_crt结构体调用过mbedtls_x509_crt_init()进行初始化。

      3. 检查证书是否损坏:可以尝试使用其他工具对该PEM证书进行解析,如openssl指令,以验证证书的完整性和有效性。

      以下是修改后的代码,包含以上的建议和修改:

      #include "mbedtls/pem.h"
      #include "mbedtls/ssl.h"
      
      unsigned char cert_buffer[] = "-----BEGIN CERTIFICATE-----\n"
      "MIIBrTCCAVKgAWIBAgIUDXpIQEyiJBRFhdFkUZSAe+ppeSIwCgYIKoZIzj0EAwIw\n"
      "JjEkMCIGA1UEAWWbTU9DSy1DQVItSUSURVJNRURJQVRFLVVTQS1NMB4XDTE5MDEw\n"
      "MTAWMDAWMFoXDTQ5MDEWMTAWMDAWMFoWKzEpMCcGA1UEAwwgVi5NTONLLlVTTS5C\n"
      "UK5ELjAWMDEWMjAZMDQWNTA2MDCWWTATBgcqhkjOPQIBBggqhkjOPQMBBWNCAAQc\n"
      "hCuvIcwrKDuDA2ulJt286cIB9j6A3HNQiMTzypD/8qQIunRPeLZoyItj0Jcj40jS\n"
      "TSnRU/UxFeCKMUV/1oYBo1kwVzAfBgNVHSMEGDAWgBTml1BXEAkTw6sHKdRTP04R\n"
      "KZo0gZAMBgNVHRMBAf8EAjAAMBYGCiSGAQQBgsRpBQEBAf8EBTADAgEBMA4GA1Ud\n"
      "DwEB/WQEAWIHgDAKBggqhkjOPQQDAgNJADBGAiEAy190tqrQUn6wv9aMgr+8iczQ\n"
      "Uw7UmilU56dhswckNJkCIQCxDbP720D/5623kVeiEVxBDPfpaoS72sRGO+qVK3Ec\n"
      "3g==\n"
      "-----END CERTIFICATE-----\n";
      
      int main() {
          int errorCode = 0;
          mbedtls_pem_context pem_context;
          mbedtls_x509_crt x509_crt;
          mbedtls_pem_init(&pem_context);
          mbedtls_x509_crt_init(&x509_crt);
          size_t cert_buffer_len_used = 0;
      
          // PEM格式证书解析
          errorCode = mbedtls_pem_read_buffer(&pem_context, "-----BEGIN CERTIFICATE-----", "-----END CERTIFICATE-----", cert_buffer, NULL, 0, &cert_buffer_len_used);
          if (errorCode != 0) {
              printf("mbedtls_pem_read_buffer failed with error: %d\n", errorCode);
              mbedtls_pem_free(&pem_context);
              return -1;
          }
      
          // 解析PEM证书内容
          errorCode = mbedtls_x509_crt_parse(&x509_crt, pem_context.private_buf, pem_context.private_buflen);
          if (errorCode != 0) {
              printf("mbedtls_x509_crt_parse failed with error: %d\n", errorCode);
              mbedtls_pem_free(&pem_context);
              mbedtls_x509_crt_free(&x509_crt);
              return -1;
          }
      
          // 证书解析成功
          // TODO: 在此处对证书进行操作
      
          // 释放资源
          mbedtls_pem_free(&pem_context);
          mbedtls_x509_crt_free(&x509_crt);
      
          return 0;
      }
      

      希望以上建议和修改能帮助你解决问题。如果问题仍然存在,请提供更多的信息,如错误码的定义和错误描述,以便我们进一步分析和解决。

      展开全部

      评论
    • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-19 13:45
      关注

      引自免费微信小程序:皆我百晓生

      首先,根据您提供的错误信息 -9570: ASN1 tag was of an unexpected value,这通常意味着在解码ASN.1结构时,遇到了一个未预期的数据类型标签。

      为了帮助您解决这个问题,我们需要检查几个可能的问题点:

      1. 检查PEM格式是否正确。
      2. 确保证书数据没有被意外修改。
      3. 检查证书数据是否完整,包括开始和结束标记(例如,-----BEGIN CERTIFICATE----------END CERTIFICATE-----)。
      4. 使用适当的函数对PEM编码的证书进行解码,并确保传递正确的参数给mbedtls的函数。

      下面是针对您的代码片段进行的修改建议,以确保证书正确解码并解析:

      #include 
      #include 
      
      // ...其他必要的头文件...
      
      int main(void)
      {
          // ...其他初始化...
      
          const char* pem_header = "-----BEGIN CERTIFICATE-----";
          const char* pem_footer = "-----END CERTIFICATE-----";
      
          unsigned char cert_buffer[] = ... // Your certificate data here
      
          int pem_context_len = strlen(pem_header) + strlen(cert_buffer) + strlen(pem_footer);
          unsigned char* pem_context = malloc(pem_context_len);
          if (pem_context == NULL) {
              // Handle memory allocation error
              return -1;
          }
      
          strcpy((char*)pem_context, pem_header);
          memcpy(pem_context + strlen(pem_header), cert_buffer, strlen(cert_buffer));
          strcat((char*)pem_context, pem_footer);
      
          size_t pem_context_len_used;
          int errorCode;
      
          // 解码PEM数据
          errorCode = mbedtls_pem_read_buffer(pem_context, pem_header, pem_footer, pem_context, pem_context_len, &pem_context_len_used);
          if (errorCode != 0) {
              print_error("mbedtls_pem_read_buffer", errorCode, pem_context_len_used);
              goto cleanup;
          }
      
          // 初始化证书结构体
          mbedtls_x509_crt x509_crt;
          mbedtls_x509_crt_init(&x509_crt);
      
          // 使用mbedtls_x509_crt_parse Der方式进行解析
          errorCode = mbedtls_x509_crt_parse(&x509_crt, pem_context, pem_context_len_used);
          if (errorCode != 0) {
              print_error("mbedtls_x509_crt_parse", errorCode, 0);
              goto cleanup;
          }
      
          // 在这里,证书已成功解析,您可以进一步处理它
      
      cleanup:
          // 清理资源
          mbedtls_x509_crt_free(&x509_crt);
          free(pem_context);
          return errorCode;
      }
      

      在这个示例中,我们首先将PEM头、证书数据和尾部拼接在一起,然后使用mbedtls_pem_read_buffer函数解码整个PEM字符串。接着,我们使用mbedtls_x509_crt_parse函数解析证书,而不是之前使用的mbedtls_x509_crt_parse_der_with_ext_cb。这是因为后者通常用于带有扩展的证书,并且可能不是处理普通证书的最佳选择。

      请注意,此代码段仅作为指导,实际应用中可能需要根据项目需求进行调整。如果您仍然遇到问题,请提供完整的错误日志或调试信息,以便更深入地分析问题。

      展开全部

      评论 编辑记录
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    软考 - 05 信息物理系统(Cyber Physical Systems, CPS)
    springboot基于java的校园二手书籍交易平台毕业设计源码131558
    ElasticSearch ( 五 ) ik中文分词
    钉钉氚云到金碟之三 DELPHI从氚云下载数据
    关于专利技术交底书分类的真相
    kafka介绍
    JS中跳转传参的几种方法
    MySQL ——多表连接查询
    面向对象设计原则总结:SOLID/LKP/DRY/KISS…
    【云原生】-MySQL压测神器HammerDB的部署及使用
  • 原文地址:https://ask.csdn.net/questions/8091214